mybatis源碼閱讀筆記一reflection包

首先看下整個包的結構:


reflection

一炸客、factory包

factory包中有一個接口ObjectFactory和這個接口的唯一實現(xiàn)類DefaultObjectFactory,從名字上看起來像是一個工廠是尔?


factory包

ObjectFactory

ObjectFactory接口中有4個方法:

  • setProperties():用于配置configuration的屬性
  • create():使用默認構造函數(shù)構建一個新的對象
  • create(......):使用指定的構造函數(shù)和參數(shù)
  • isCollection():返回這個對象是否是集合嗜历,主要是為了支持為了支持Scala collections(不了解)

DefaultObjectFactory

  • resolveInterface():用于解析接口抖所,將接口轉化為具體實現(xiàn)類。
    其中
    1. List暴匠、Collection傻粘、Iterable轉換為ArrayList
    2. Map轉換為HashMap
    3. SortedSet轉換為TreeSet
    4. Set轉換為HashSet
  • instantiateClass():create()之后會調用這個方法弦悉,如果傳入的構造函數(shù)為null,就直接調用newInstance()進行實例化稽莉。
    其他方法的功能如接口描述污秆,不再贅述。

二战得、invoker包

invoker包

一個Invoker接口庸推,三個實現(xiàn)類贬媒。

Invoker接口

只有兩個方法


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包

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包

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():如果屬性名為空字符串,直接返回殷勘,否則根據(jù)屬性的名字返回對應的值此再,調用的是MetaObject中的getValue()方法,會在下面提到玲销。
  • setCollectionValue():前面提到的first[0].second[2].third[0]输拇,有角標的類型有兩種情況,分別是Map和List贤斜,接下來是其他類型的賦值策吠。
  • getCollectionValue():與setCollectionValue()類似。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瘩绒,一起剝皮案震驚了整個濱河市猴抹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锁荔,老刑警劉巖蟀给,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡坤溃,警方通過查閱死者的電腦和手機拍霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薪介,“玉大人祠饺,你說我怎么就攤上這事≈” “怎么了道偷?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長记劈。 經(jīng)常有香客問我勺鸦,道長,這世上最難降的妖魔是什么目木? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任换途,我火速辦了婚禮,結果婚禮上刽射,老公的妹妹穿的比我還像新娘军拟。我一直安慰自己,他們只是感情好誓禁,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布懈息。 她就那樣靜靜地躺著,像睡著了一般摹恰。 火紅的嫁衣襯著肌膚如雪辫继。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天俗慈,我揣著相機與錄音姑宽,去河邊找鬼。 笑死闺阱,一個胖子當著我的面吹牛炮车,可吹牛的內容都是我干的。 我是一名探鬼主播馏颂,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼示血,長吁一口氣:“原來是場噩夢啊……” “哼棋傍!你這毒婦竟也來了救拉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瘫拣,失蹤者是張志新(化名)和其女友劉穎亿絮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡派昧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年黔姜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒂萎。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秆吵,死狀恐怖,靈堂內的尸體忽然破棺而出五慈,到底是詐尸還是另有隱情纳寂,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布泻拦,位于F島的核電站毙芜,受9級特大地震影響,放射性物質發(fā)生泄漏争拐。R本人自食惡果不足惜腋粥,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望架曹。 院中可真熱鬧隘冲,春花似錦、人聲如沸音瓷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绳慎。三九已至纵竖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杏愤,已是汗流浹背靡砌。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留珊楼,地道東北人通殃。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像厕宗,于是被迫代替她去往敵國和親画舌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容

  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,387評論 8 265
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,128評論 0 21
  • OC語言基礎 1.類與對象 類方法 OC的類方法只有2種:靜態(tài)方法和實例方法兩種 在OC中已慢,只要方法聲明在@int...
    奇異果好補閱讀 4,273評論 0 11
  • 離開了太久曲聂,已經(jīng)找不到最初的感覺,我是否要與你永久的分離佑惠,不再觸碰你的心靈朋腋,抑或從來就沒有走近過你齐疙,在這飄...
    小鳥的鳴叫閱讀 152評論 0 0
  • 每天看似相同贞奋,但卻是真正的不同,時光的長河帶著我們從相識穷绵,相知轿塔,相愛,相忘…… 只到后來仲墨,我們都會消失在這時光的長...
    張拉閱讀 111評論 0 1