Lombok原理

一鸵熟、項(xiàng)目背景

在寫Java程序的時(shí)候經(jīng)常會(huì)遇到如下情形:
新建了一個(gè)Class類,然后在其中設(shè)置了幾個(gè)字段摩窃,最后還需要花費(fèi)很多時(shí)間來(lái)建立getter和setter方法
lombok項(xiàng)目的產(chǎn)生就是為了省去我們手動(dòng)創(chuàng)建getter和setter方法的麻煩花吟,它能夠在我們編譯源碼的時(shí)候自動(dòng)幫我們生成getter和setter方法。即它最終能夠達(dá)到的效果是:在源碼中沒有g(shù)etter和setter方法灾锯,但是在編譯生成的字節(jié)碼文件中有g(shù)etter和setter方法
比如源碼文件:

import java.io.Serializable;

import lombok.Data;

@Data
public class BasicClusterInfo implements Serializable {

    private static final long serialVersionUID = 3478135817352393604L;
    private String            hbaseKey;
    private int               receiverCount;
}

以下是編譯上述源碼文件得到的字節(jié)碼文件,對(duì)其反編譯得到的結(jié)果

public class BasicClusterInfo extends java.lang.Object implements java.io.Serializable{
    public BasicClusterInfo();
    public java.lang.String getHbaseKey();
    public int getReceiverCount();
    public void setHbaseKey(java.lang.String);
    public void setReceiverCount(int);
    public boolean equals(java.lang.Object);
    public boolean canEqual(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
}

二嗅榕、使用方法

lombok網(wǎng)址:https://projectlombok.org/download.html

Eclipse支持需要點(diǎn)擊運(yùn)行下載的jar包

Maven依賴:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.6</version>
    <scope>provided</scope>
</dependency>

使用lombok項(xiàng)目的方法很簡(jiǎn)單顺饮,分為四個(gè)步驟:
1)在需要自動(dòng)生成getter和setter方法的類上,加上@Data注解
2)在編譯類路徑中加入lombok.jar包
3)使用支持lombok的編譯工具編譯源代碼(關(guān)于支持lombok的編譯工具凌那,見“四兼雄、支持lombok的編譯工具”)
4)編譯得到的字節(jié)碼文件中自動(dòng)生成了getter和setter方法

三、原理分析

接下來(lái)進(jìn)行l(wèi)ombok能夠工作的原理分析帽蝶,以O(shè)racle的javac編譯工具為例赦肋。
自從Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”規(guī)范励稳,只要程序?qū)崿F(xiàn)了該API佃乘,就能在javac運(yùn)行的時(shí)候得到調(diào)用。
舉例來(lái)說(shuō)驹尼,現(xiàn)在有一個(gè)實(shí)現(xiàn)了"JSR 269 API"的程序A,那么使用javac編譯源碼的時(shí)候具體流程如下:
1)javac對(duì)源代碼進(jìn)行分析趣避,生成一棵抽象語(yǔ)法樹(AST)
2)運(yùn)行過程中調(diào)用實(shí)現(xiàn)了"JSR 269 API"的A程序
3)此時(shí)A程序就可以完成它自己的邏輯,包括修改第一步驟得到的抽象語(yǔ)法樹(AST)
4)javac使用修改后的抽象語(yǔ)法樹(AST)生成字節(jié)碼文件
詳細(xì)的流程圖如下:


image

lombok本質(zhì)上就是這樣的一個(gè)實(shí)現(xiàn)了"JSR 269 API"的程序新翎。在使用javac的過程中程帕,它產(chǎn)生作用的具體流程如下:
1)javac對(duì)源代碼進(jìn)行分析,生成一棵抽象語(yǔ)法樹(AST)
2)運(yùn)行過程中調(diào)用實(shí)現(xiàn)了"JSR 269 API"的lombok程序
3)此時(shí)lombok就對(duì)第一步驟得到的AST進(jìn)行處理料祠,找到@Data注解所在類對(duì)應(yīng)的語(yǔ)法樹(AST)骆捧,然后修改該語(yǔ)法樹(AST)澎羞,增加getter和setter方法定義的相應(yīng)樹節(jié)點(diǎn)
4)javac使用修改后的抽象語(yǔ)法樹(AST)生成字節(jié)碼文件

四髓绽、支持lombok的編譯工具

1)由“三、原理分析”可知妆绞,Oracle javac直接支持lombok
2)常用的項(xiàng)目管理工具M(jìn)aven所使用的java編譯工具來(lái)源于配置的第三方工具顺呕,如果我們配置這個(gè)第三方工具為Oracle javac的話枫攀,那么Maven也就直接支持lombok了
3)Intellij Idea配置的編譯工具為Oracle javac的話,也就直接支持lombok了株茶。
4)Eclipse中使用的不是Oracle javac這個(gè)編譯工具来涨,而是自己實(shí)現(xiàn)的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得進(jìn)行設(shè)置启盛,具體是在Eclipse程序目錄中的eclipse.ini文件中添加如下兩行設(shè)置:
-javaagent:[lombok.jar所在路徑]
-Xbootclasspath/a:[lombok.jar所在路徑]

五蹦掐、其他問題

現(xiàn)在使用Intellij Idea作為Java項(xiàng)目的IDE,配置Oracle javac作為編譯工具僵闯。
現(xiàn)在有一個(gè)A類卧抗,其中有一些字段,沒有創(chuàng)建它們的setter和getter方法鳖粟,使用了lombok的@Data注解社裆,另外有一個(gè)B類,它調(diào)用了A類實(shí)例的相應(yīng)字段的setter和getter方法
編譯A類和B類所在的項(xiàng)目向图,并不會(huì)報(bào)錯(cuò)泳秀,因?yàn)樽罱K生成的A類字節(jié)碼文件中存在相應(yīng)字段的setter和getter方法
但是,IDE發(fā)現(xiàn)B類源代碼中所使用的A類實(shí)例的setter和getter方法在A類源代碼中找不到定義榄攀,IDE會(huì)認(rèn)為這是錯(cuò)誤
要解決以上這個(gè)不是真正錯(cuò)誤的錯(cuò)誤嗜傅,可以下載安裝Intellij Idea中的"Lombok plugin"。

六檩赢、lombok的罪惡

使用lombok雖然能夠省去手動(dòng)創(chuàng)建setter和getter方法的麻煩磺陡,但是卻大大降低了源代碼文件的可讀性和完整性,降低了閱讀源代碼的舒適度漠畜。

參考文獻(xiàn)

[1]http://stackoverflow.com/questions/6107197/how-does-lombok-work
[2]https://projectlombok.org/download.html
[3]http://stackoverflow.com/questions/3061654/what-is-the-difference-between-javac-and-the-eclipse-compiler
[4]http://www.ibm.com/developerworks/library/j-lombok/
[5]http://notatube.blogspot.com/2010/12/project-lombok-creating-custom.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末币他,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子憔狞,更是在濱河造成了極大的恐慌蝴悉,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘾敢,死亡現(xiàn)場(chǎng)離奇詭異拍冠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)簇抵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門庆杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碟摆,你說(shuō)我怎么就攤上這事晃财。” “怎么了典蜕?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵断盛,是天一觀的道長(zhǎng)罗洗。 經(jīng)常有香客問我,道長(zhǎng)钢猛,這世上最難降的妖魔是什么伙菜? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮命迈,結(jié)果婚禮上贩绕,老公的妹妹穿的比我還像新娘。我一直安慰自己壶愤,他們只是感情好丧叽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著公你,像睡著了一般踊淳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陕靠,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天迂尝,我揣著相機(jī)與錄音,去河邊找鬼剪芥。 笑死垄开,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的税肪。 我是一名探鬼主播溉躲,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼益兄!你這毒婦竟也來(lái)了锻梳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤净捅,失蹤者是張志新(化名)和其女友劉穎疑枯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛔六,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荆永,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了国章。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片具钥。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖液兽,靈堂內(nèi)的尸體忽然破棺而出骂删,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布桃漾,位于F島的核電站坏匪,受9級(jí)特大地震影響拟逮,放射性物質(zhì)發(fā)生泄漏撬统。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一敦迄、第九天 我趴在偏房一處隱蔽的房頂上張望恋追。 院中可真熱鬧,春花似錦罚屋、人聲如沸苦囱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撕彤。三九已至,卻和暖如春猛拴,著一層夾襖步出監(jiān)牢的瞬間羹铅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工愉昆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留职员,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓跛溉,卻偏偏與公主長(zhǎng)得像焊切,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芳室,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • Lombok是一款通過注解在Java編譯期生成代碼的工具专肪,通過使用其內(nèi)置的一些注解如@Getter, @Set...
    伊凡的一天閱讀 9,040評(píng)論 0 1
  • 1 簡(jiǎn)介 Lombok是一款好用順手的工具,就像Google Guava一樣堪侯,在此予以強(qiáng)烈推薦牵祟,每一個(gè)Java工程...
    七寸知架構(gòu)閱讀 7,041評(píng)論 1 56
  • Android上使用Lombok [TOC] 簡(jiǎn)介 最近幾天嘗試了一把后端的工作,發(fā)現(xiàn)后端同學(xué)使用了一個(gè)第三庫(kù)——...
    流水不腐小夏閱讀 17,215評(píng)論 9 9
  • 最近這半年多來(lái)收奔,我一直在思考,我輩在這個(gè)紛擾的時(shí)代滓玖,是如何飄蕩至今的坪哄。我是一個(gè)80后,今年30歲。80年代出生的我...
    王宜冰閱讀 534評(píng)論 0 1
  • 放假在家翩肌,即使現(xiàn)在已經(jīng)脫離了高中生的范疇模暗,高考的余震依舊在心中繞之不去。放縱的高一念祭,迷茫的高二兑宇,拼搏的高三,三年...
    歐尼容閱讀 244評(píng)論 0 2