Lombok工作原理和使用

Lombok工作原理

在Lombok使用的過程中,只需要添加相應(yīng)的注解,無需再為此寫任何代碼辕近。自動生成的代碼到底是如何產(chǎn)生的呢?

核心之處就是對于注解的解析上匿垄。JDK5引入了注解的同時移宅,也提供了兩種解析方式。

1運行時解析

運行時能夠解析的注解椿疗,必須將@Retention設(shè)置為RUNTIME吞杭,這樣就可以通過反射拿到該注解。java.lang.reflect反射包中提供了一個接口AnnotatedElement变丧,該接口定義了獲取注解信息的幾個方法,Class绢掰、Constructor痒蓬、Field、Method滴劲、Package等都實現(xiàn)了該接口攻晒,對反射熟悉的朋友應(yīng)該都會很熟悉這種解析方式。

2編譯時解析

編譯時解析有兩種機(jī)制班挖,分別簡單描述下:

a)Annotation Processing Tool

apt自JDK5產(chǎn)生鲁捏,JDK7已標(biāo)記為過期,不推薦使用萧芙,JDK8中已徹底刪除给梅,自JDK6開始,可以使用Pluggable Annotation Processing API來替換它双揪,apt被替換主要有2點原因:

[1]api都在com.sun.mirror非標(biāo)準(zhǔn)包下

[2]沒有集成到j(luò)avac中动羽,需要額外運行

b)Pluggable Annotation Processing API

JSR 269自JDK6加入,作為apt的替代方案渔期,它解決了apt的兩個問題运吓,javac在執(zhí)行的時候會調(diào)用實現(xiàn)了該API的程序渴邦,這樣我們就可以對編譯器做一些增強(qiáng),javac執(zhí)行的過程如下:

圖1

Lombok本質(zhì)上就是一個實現(xiàn)了“JSR 269 API”的程序拘哨。在使用javac的過程中谋梭,它產(chǎn)生作用的具體流程如下:

1.javac對源代碼進(jìn)行分析,生成了一棵抽象語法樹(AST)

2.運行過程中調(diào)用實現(xiàn)了“JSR 269 API”的Lombok程序

3.此時Lombok就對第一步驟得到的AST進(jìn)行處理倦青,找到@Data注解所在類對應(yīng)的語法樹(AST)瓮床,然后修改該語法樹(AST),增加getter和setter方法定義的相應(yīng)樹節(jié)點

4.javac使用修改后的抽象語法樹(AST)生成字節(jié)碼文件姨夹,即給class增加新的節(jié)點(代碼塊)

通過讀Lombok源碼纤垂,發(fā)現(xiàn)對應(yīng)注解的實現(xiàn)都在HandleXXX中,比如@Getter注解的實現(xiàn)在HandleGetter.handle()磷账。還有一些其它類庫使用這種方式實現(xiàn)峭沦,比如Google AutoDagger等等逃糟。

Lombok使用

下面介紹一下常用的幾個注解:

@Setter?注解在類或字段吼鱼,注解在類時為所有字段生成setter方法,注解在字段上時只為該字段生成setter方法绰咽。

@Getter?使用方法同上菇肃,區(qū)別在于生成的是getter方法。

@ToString?注解在類取募,添加toString方法琐谤。調(diào)用toString()方法,可以輸出實體類中所有屬性的值玩敏。

@EqualsAndHashCode?注解在類斗忌,生成hashCode和equals方法。

@NoArgsConstructor?注解在類旺聚,生成無參的構(gòu)造方法织阳。

@RequiredArgsConstructor?注解在類,為類中需要特殊處理的字段生成構(gòu)造方法砰粹,比如final和被@NonNull注解的字段唧躲。

@AllArgsConstructor?注解在類,生成包含類中所有字段的構(gòu)造方法碱璃。

@Data?注解在類弄痹,生成setter/getter、equals嵌器、canEqual界酒、hashCode、toString嘴秸、EqualsAndHashCode毁欣、RequiredArgsConstrutor方法庇谆,如為final屬性,則不會為該屬性生成setter方法凭疮。

@Slf4j?注解在類饭耳,生成log變量,嚴(yán)格意義來說是常量执解。private static final Logger log = LoggerFactory.getLogger(UserController.class);

接下來我們編輯一個實體類Student寞肖,添加幾個屬性,最后在類上添加@Data屬性衰腌,這個注解可以幫我們在.class文件中生成類中所有屬性的get/set方法新蟆、equals、canEqual右蕊、hashCode琼稻、toString方法等。

圖2

這是之前沒有加@Data注解的寫法的對比會發(fā)現(xiàn)加了注解的代碼少了get/set方法饶囚。

圖3

下面創(chuàng)建一個類進(jìn)行測試帕翻,發(fā)現(xiàn)沒有g(shù)et/set方法的實體類加了注解以后也是可以正常調(diào)用get/set方法的。

圖4

下一篇是Lombok優(yōu)缺點和總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載萝风,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者嘀掸。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市规惰,隨后出現(xiàn)的幾起案子睬塌,更是在濱河造成了極大的恐慌,老刑警劉巖歇万,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衫仑,死亡現(xiàn)場離奇詭異,居然都是意外死亡堕花,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門粥鞋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缘挽,“玉大人,你說我怎么就攤上這事呻粹『韭” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵等浊,是天一觀的道長腮郊。 經(jīng)常有香客問我,道長筹燕,這世上最難降的妖魔是什么轧飞? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任衅鹿,我火速辦了婚禮,結(jié)果婚禮上过咬,老公的妹妹穿的比我還像新娘大渤。我一直安慰自己,他們只是感情好掸绞,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布泵三。 她就那樣靜靜地躺著,像睡著了一般衔掸。 火紅的嫁衣襯著肌膚如雪烫幕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天敞映,我揣著相機(jī)與錄音较曼,去河邊找鬼。 笑死驱显,一個胖子當(dāng)著我的面吹牛诗芜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埃疫,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伏恐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栓霜?” 一聲冷哼從身側(cè)響起翠桦,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胳蛮,沒想到半個月后销凑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡仅炊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年斗幼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抚垄。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜕窿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呆馁,到底是詐尸還是另有隱情桐经,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布浙滤,位于F島的核電站阴挣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纺腊。R本人自食惡果不足惜畔咧,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一茎芭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒卸,春花似錦骗爆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虹蓄,卻和暖如春犀呼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薇组。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工外臂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人律胀。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓宋光,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炭菌。 傳聞我的和親對象是個殘疾皇子罪佳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容