首先看下整个包的结构:
reflection
一、factory包
factory包中有一个接口ObjectFactory和这个接口的唯一实现类DefaultObjectFactory,从名字上看起来像是一个工厂?
factory包
ObjectFactory
ObjectFactory接口中有4个方法:
- setProperties():用于配置configuration的属性
- create():使用默认构造函数构建一个新的对象
- create(......):使用指定的构造函数和参数
- isCollection():返回这个对象是否是集合,主要是为了支持为了支持Scala collections(不了解)
DefaultObjectFactory
- resolveInterface():用于解析接口,将接口转化为具体实现类。
其中- List、Collection、Iterable转换为ArrayList
- Map转换为HashMap
- SortedSet转换为TreeSet
- Set转换为HashSet
- instantiateClass():create()之后会调用这个方法,如果传入的构造函数为null,就直接调用newInstance()进行实例化。
其他方法的功能如接口描述,不再赘述。
二、invoker包
invoker包一个Invoker接口,三个实现类。
Invoker接口
只有两个方法
Invoker
- invoke():用于调用
- getType():用于取得类型
GetFieldInvoker类
实现Invoker接口,调用Field.get()和Field.getType()
SetFieldInvoker类
实现Invoker接口,调用Field.set()和Field.setType()
MethodInvoker类
这个类同样是实现Invoker接口,调用method.invoke(),与前面两个类不同的是,这个类的构造函数,如果方法只有一个参数就直接返回type,如果有多个参数,就返回invoke()执行后返回的类型。
property包
property包PropertyCopier类
只有一个方法
copyBeanProperties():属性复制,父类的属性都要复制过来
PropertyNamer
-
methodToProperty():正如名字所说,将方法转换为属性,如果是is开头就去截掉前两位,如果是get或者set开头就截取前三位,如果都不是则抛出反射异常。然后判断如果属性只有一个字符或者大于一个字符并且第二个字符不是大写的,就将首字母小写,猜测这段代码的意图是,只对符合javabean规范的属性做小写处理,如果不符合规范,可能开发者有自己的考虑,不做处理,原样返回。
-
isProperty():如果是get、set、is开头那么久返回true,为什么is开头可以判断是属性呢?猜测是因为boolean类型生成getter方法的时候,是isPropertyName()。
-
isGetter:判断是不是getter方法
-
isSetter:判断是不是setter方法
PropertyTokenizer
迭代器模式的实现,实现了Iterator接口,迭代获取类似first[0].second[1].third[0]这种属性。
-
PropertyTokenizer(String fullname):构造函数,先在字符串中找"."(点),然后判断如果存在,就用第一个点将字符串分开,分为name和children,如果没有点,就取整个字符串,然后将中括号中的数字解析出来,
-
hasNext():判断children是不是null就可以了,如果children是null,说明已经解析完成。
-
next():直接用children为字符串创建新的实例,调用构造方法。
wrapper包
wrapper包包的结构如图所示
Wrapper包结构
ObjectWrapper接口
对象包装器
- get(PropertyTokenizer prop):get方法
- set(PropertyTokenizer prop, Object value):set方法
- findProperty(...):查找属性
- getGetterNames():获取所有getter的名字
- getSetterNames():获取所有setter的名字
- getSetterType(...):取得setter的类型
- getGetterType(...):取得getter的类型
- hasSetter():按照名字查找setter
- hasGetter():按照名字查找setter
- instantiatePropertyValue(...):实例化属性
- isConllection():是否是集合
- add():添加属性
- addAll(...) :加属性
BaseWrapper
- resolveCollection():如果属性名为空字符串,直接返回,否则根据属性的名字返回对应的值,调用的是MetaObject中的getValue()方法,会在下面提到。
- setCollectionValue():前面提到的first[0].second[2].third[0],有角标的类型有两种情况,分别是Map和List,接下来是其他类型的赋值。
- getCollectionValue():与setCollectionValue()类似。
网友评论