首先看下整個包的結構:
一炸客、factory包
factory包中有一個接口ObjectFactory和這個接口的唯一實現(xiàn)類DefaultObjectFactory,從名字上看起來像是一個工廠是尔?
ObjectFactory
ObjectFactory接口中有4個方法:
- setProperties():用于配置configuration的屬性
- create():使用默認構造函數(shù)構建一個新的對象
- create(......):使用指定的構造函數(shù)和參數(shù)
- isCollection():返回這個對象是否是集合嗜历,主要是為了支持為了支持Scala collections(不了解)
DefaultObjectFactory
- resolveInterface():用于解析接口抖所,將接口轉化為具體實現(xiàn)類。
其中- List暴匠、Collection傻粘、Iterable轉換為ArrayList
- Map轉換為HashMap
- SortedSet轉換為TreeSet
- Set轉換為HashSet
- instantiateClass():create()之后會調用這個方法弦悉,如果傳入的構造函數(shù)為null,就直接調用newInstance()進行實例化稽莉。
其他方法的功能如接口描述污秆,不再贅述。
二战得、invoker包
一個Invoker接口庸推,三個實現(xiàn)類贬媒。
Invoker接口
只有兩個方法
- invoke():用于調用
- getType():用于取得類型
GetFieldInvoker類
實現(xiàn)Invoker接口,調用Field.get()和Field.getType()
SetFieldInvoker類
實現(xiàn)Invoker接口杀捻,調用Field.set()和Field.setType()
MethodInvoker類
這個類同樣是實現(xiàn)Invoker接口,調用method.invoke()仅仆,與前面兩個類不同的是垢袱,這個類的構造函數(shù)请契,如果方法只有一個參數(shù)就直接返回type,如果有多個參數(shù)爽锥,就返回invoke()執(zhí)行后返回的類型氯夷。
property包
PropertyCopier類
只有一個方法
copyBeanProperties():屬性復制,父類的屬性都要復制過來
PropertyNamer
methodToProperty():正如名字所說腮考,將方法轉換為屬性踩蔚,如果是is開頭就去截掉前兩位,如果是get或者set開頭就截取前三位馅闽,如果都不是則拋出反射異常捞蛋。然后判斷如果屬性只有一個字符或者大于一個字符并且第二個字符不是大寫的柬姚,就將首字母小寫,猜測這段代碼的意圖是搬设,只對符合javabean規(guī)范的屬性做小寫處理撕捍,如果不符合規(guī)范忧风,可能開發(fā)者有自己的考慮默色,不做處理,原樣返回狮腿。
isProperty():如果是get腿宰、set呕诉、is開頭那么久返回true,為什么is開頭可以判斷是屬性呢吃度?猜測是因為boolean類型生成getter方法的時候甩挫,是isPropertyName()洒试。
isGetter:判斷是不是getter方法
isSetter:判斷是不是setter方法
PropertyTokenizer
迭代器模式的實現(xiàn)兽狭,實現(xiàn)了Iterator接口,迭代獲取類似first[0].second[1].third[0]這種屬性胁赢。
PropertyTokenizer(String fullname):構造函數(shù)亦渗,先在字符串中找"."(點),然后判斷如果存在兑牡,就用第一個點將字符串分開央碟,分為name和children,如果沒有點均函,就取整個字符串亿虽,然后將中括號中的數(shù)字解析出來,
hasNext():判斷children是不是null就可以了苞也,如果children是null洛勉,說明已經(jīng)解析完成。
next():直接用children為字符串創(chuàng)建新的實例如迟,調用構造方法收毫。
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():如果屬性名為空字符串,直接返回殷勘,否則根據(jù)屬性的名字返回對應的值此再,調用的是MetaObject中的getValue()方法,會在下面提到玲销。
- setCollectionValue():前面提到的first[0].second[2].third[0]输拇,有角標的類型有兩種情況,分別是Map和List贤斜,接下來是其他類型的賦值策吠。
- getCollectionValue():與setCollectionValue()類似。