2.4.1.用于缓存类的元数据的 MetaClass
优质
小牛编辑
128浏览
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
,之后通过ReflectorFactory
的findForClass
方法为指定的java类型生成对应的Reflector
对象,并赋值给reflector
属性,这样MetaClass
对象的创建工作就完成了。
那么ReflectorFactory
又是如何为指定的java类型创建Reflector
对象的呢?我们继续往下看。