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

浙公网安备 33010602011771号