聊聊mybatis的反射之Invoker模块
上篇文章中我们介绍了mybatis的Reflector的构造方法,深入源码分析了一波,并了解到对于属性的getter setter方法封装成map集合中,key是属性名,value是MethodInvoker,没有getter setter方法的属性也是封装到了map中,key是属性名,value是GetFieldInvoker和SetFieldInvoker,他们都是Invoker接口的实现类,下面看一下Invoker接口
Invoker接口
Invoker接口:
public interface Invoker {
//调用
Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;
//取得类型
Class<?> getType();
}
接口比较简单,只有两个方法,MethodInvoker, GetFieldInvoker ,SetFieldInvoker这三个类都实现了Invoker接口,MethodInvoker重写了invoke方法,方法中就是直接调用Method.invoke方法
MethodInvoker类
MethodInvoker类:
public class MethodInvoker implements Invoker {
private Class<?> type;
private Method method;
public MethodInvoker(Method method) {
this.method = method;
//如果只有一个参数,返回参数类型,否则返回return的类型
if (method.getParameterTypes().length == 1) {
type = method.getParameterTypes()[0];
} else {
type = method.getReturnType();
}
}
//就是调用Method.invoke
@Override
public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException {
return method.invoke(target, args);
}
@Override
public Class<?> getType() {
return type;
}
}
GetFieldInvoker类
GetFieldInvoker是Field作为成员变量,invoke方法中调用field.get(target)方法 GetFieldInvoker:
public class GetFieldInvoker implements Invoker {
private Field field;
public GetFieldInvoker(Field field) {
this.field = field;
}
//就是调用Field.get
@Override
public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException {
return field.get(target);
}
@Override
public Class<?> getType() {
return field.getType();
}
}
ReflectorFactory接口
另外,ReflectorFactory 是一个工接口,它的默认实现类是DefaultReflectorFactory
接口:
public interface ReflectorFactory {
boolean isClassCacheEnabled();
void setClassCacheEnabled(boolean classCacheEnabled);
Reflector findForClass(Class<?> type);
}
DefaultReflectorFactory实现类:
public class DefaultReflectorFactory implements ReflectorFactory {
private boolean classCacheEnabled = true;
private final ConcurrentMap<Class<?>, Reflector> reflectorMap = new ConcurrentHashMap<>();
public DefaultReflectorFactory() {
}
@Override
public boolean isClassCacheEnabled() {
return classCacheEnabled;
}
@Override
public void setClassCacheEnabled(boolean classCacheEnabled) {
this.classCacheEnabled = classCacheEnabled;
}
/**
* 生产Reflector对象
* @param type 目标类型
* @return 目标类型的Reflector对象
*/
@Override
public Reflector findForClass(Class<?> type) {
if (classCacheEnabled) { // 允许缓存
// 生产入参type的反射器对象,并放入缓存
return reflectorMap.computeIfAbsent(type, Reflector::new);
} else {
return new Reflector(type);
}
}
}
DefaultReflectorFactory中使用ConcurrentHashMap来做缓存,缓存的是class对应的Reflector对象信息
总结
这篇文章主要讲解了Invoker接口和它实现类GetFieldInvoker,以及ReflectorFactory接口和它的默认实现类,Invoker接口主要是用来更加Class类来生成MethodInvoker, GetFieldInvoker ,SetFieldInvoker具体对象信息的并保存在map中供其他方法使用,ReflectorFactory是主要是用于Reflector对象的缓存,它的默认实现类是DefaultReflectorFactory,缓存是利用的ConcurrentHashMap来进行缓存的。
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话:
- 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏