解析MetaClass
在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对象的呢?我们继续往下看。