聊聊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来进行缓存的。

❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话:

  1. 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏