2.4.1.用于缓存类的元数据的 MetaClass

优质
小牛编辑
120浏览
2023-12-01

settings解析代码里面涉及到了一个新的对象,叫做MetaClass,MetaClass的作用是保存指定类的元数据,这里的元数据指的是:指定类的可读/可写的属性、方法以及构造器等信息。

// 获取Configuration类的描述对象
MetaClass metaConfig = MetaClass.forClass(Configuration.class, localReflectorFactory);

MetaClass有两个属性,一个是用于创建Reflector对象的反射工厂ReflectorFactory,一个是Reflector对象,这两个类后面会详细的解释。

public class MetaClass {

    /**
     * Reflector创建工厂
     */
    private final ReflectorFactory reflectorFactory;
    /**
     * 存储指定类的反射数据,简化反射操作
     */
    private final Reflector reflector;

}

MetaClass对象的创建依赖于MetaClass的静态方法forClass,该方法有两个入参,一个是用于创建Reflector对象的java类型对象,一个是负责创建Reflector对象的工厂对象ReflectorFactory实例。

/**
  * 为指定的类型生成类型元数据
  *
  * @param type             指定类型
  * @param reflectorFactory 反射工厂
  * @return 类型元数据
  */
 public static MetaClass forClass(Class<?> type, ReflectorFactory reflectorFactory) {
     return new MetaClass(type, reflectorFactory);
 }

forClass方法中,创建MetaClass对象的工作实际上又交给了MetaClass的私有构造方法来完成。

private MetaClass(Class<?> type, ReflectorFactory reflectorFactory) {
      this.reflectorFactory = reflectorFactory;
      // 通过反射工厂构造反射描述
      this.reflector = reflectorFactory.findForClass(type);
  }

MetaClass的私有构造方法中,简单的将ReflectorFactory实例直接赋值给属性reflectorFactory,之后通过ReflectorFactoryfindForClass方法为指定的java类型生成对应的Reflector对象,并赋值给reflector属性,这样MetaClass对象的创建工作就完成了。

那么ReflectorFactory又是如何为指定的java类型创建Reflector对象的呢?我们继续往下看。