org.apache.ibatis.reflection.invoker.Invoker 执行器接口,这里主要是为了统一getter方法、setter方法和Field个get和set执行时的差异,使用了 对象的适配器模式 。代码和类图如下:
/**
* 执行器接口:为了统一getter方法、setter方法和Field个get和set执行时的差异
* 对象的适配器模式
* @author Clinton Begin
*/
public interface Invoker {
/**
* 执行调用
* 主要用于执行:getter方法、setter方法和Field个get和set
* @param target 目标
* @param args 参数
* @return 结果
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;
/**
* @return 类
* 差异:
* 1.getter方法 返回返回类型
* 2.setter方法 返回参数类型
* 3.Field返回自身的类型
*/
Class<?> getType();
}
复制代码
/**
* Field get属性执行器
* @author Clinton Begin
*/
public class GetFieldInvoker implements Invoker {
//Field 对象 即被适配者
private final Field field;
public GetFieldInvoker(Field field) {
this.field = field;
}
/**
* 获取 target Field的属性值
* 如果Field不可访问 (访问权限不够),则设置Accessible 强制访问
*/
@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;
}
}
}
/**
* 返回Field类型
*/
@Override
public Class<?> getType() {
return field.getType();
}
}
复制代码
/**
* Field set属性执行器
* @author Clinton Begin
*/
public class SetFieldInvoker implements Invoker {
// Field 对象 即被适配者
private final Field field;
public SetFieldInvoker(Field field) {
this.field = field;
}
/**
* 设置 target Field的属性值
* 如果Field不可访问 (访问权限不够),则设置Accessible 强制访问
*/
@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;
}
/**
* 返回Field类型
*/
@Override
public Class<?> getType() {
return field.getType();
}
}
复制代码
/**
* getter或setter方法执行器
* @author Clinton Begin
*/
public class MethodInvoker implements Invoker {
/**
* getter方法 返回返回类型
* setter方法 返回参数类型
*/
private final Class<?> type;
/**
* Method对象 即被适配者
*/
private final Method method;
public MethodInvoker(Method method) {
this.method = method;
if (method.getParameterTypes().length == 1) {
type = method.getParameterTypes()[0];
} else {
type = method.getReturnType();
}
}
/**
* 执行method对象对应的方法
* 如果method不可访问 (访问权限不够),则设置Accessible 强制访问
*/
@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;
}
}
复制代码