002 Invoker调用器

方法调用器 : 

public interface Invoker {
  Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;

  Class<?> getType();
}

  在框架的内容,使用这个对象完成方法的调用,我们看看Invoker的直接定义.

[1] 给定指定的对象和参数,进行方法调用,最终得到计算的结果.

[2]获取类型,也就是这个Invoker的实际类型.

 

在框架的内容,封装了常见的三个调用器.

分别是set调用器,get调用器,一般方法调用器.

我们首先看一般方法调用器.

public class MethodInvoker implements Invoker {

  private final Class<?> type;
  private final Method method;

  public MethodInvoker(Method method) {
    this.method = method;

    if (method.getParameterTypes().length == 1) {
      type = method.getParameterTypes()[0];
    } else {
      type = method.getReturnType();
    }
  }

  @Override
  public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException {
    try {
      return method.invoke(target, args);
    } catch (IllegalAccessException e) {
      if (Reflector.canControlMemberAccessible()) {
        method.setAccessible(true);
        return method.invoke(target, args);
      } else {
        throw e;
      }
    }
  }

  @Override
  public Class<?> getType() {
    return type;
  }
}

  通过上面的代码,我们可以直接看到对应的方法调用的过程,就是封装了一般的方法调用,在这里,我们看到getType的定义,现在是非常模糊的,不知道到底是干什么用的.

public class GetFieldInvoker implements Invoker {
  private final Field field;

  public GetFieldInvoker(Field field) {
    this.field = field;
  }

  @Override
  public Object invoke(Object target, Object[] args) throws IllegalAccessException {
    try {
      return field.get(target);
    } catch (IllegalAccessException e) {
      if (Reflector.canControlMemberAccessible()) {
        field.setAccessible(true);
        return field.get(target);
      } else {
        throw e;
      }
    }
  }

  @Override
  public Class<?> getType() {
    return field.getType();
  }
}

  get调用器也是非常简单的,我们可以通过get调用器获取到对应的域的真实值.

public class SetFieldInvoker implements Invoker {
  private final Field field;

  public SetFieldInvoker(Field field) {
    this.field = field;
  }

  @Override
  public Object invoke(Object target, Object[] args) throws IllegalAccessException {
    try {
      field.set(target, args[0]);
    } catch (IllegalAccessException e) {
      if (Reflector.canControlMemberAccessible()) {
        field.setAccessible(true);
        field.set(target, args[0]);
      } else {
        throw e;
      }
    }
    return null;
  }

  @Override
  public Class<?> getType() {
    return field.getType();
  }
}

  set调用器也非常简单,就是对一个域的设置工作.

posted @ 2020-05-06 13:44  最爱五仁月饼  阅读(175)  评论(0编辑  收藏  举报