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调用器也非常简单,就是对一个域的设置工作.