eclipse lombok插件安装_你干啥的?Lombok
01、Lombok 的自我介紹
Lombok 在官網(wǎng)是這樣作自我介紹的:
Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.說(shuō)實(shí)話,我英文不太好(不是找借口,真的),但借助金山詞霸,大致知道了這段英文的意思:Lombok 是個(gè)好類(lèi)庫(kù),可以為 Java 代碼添加一些“處理程序”,讓其變得更簡(jiǎn)潔、更優(yōu)雅。
據(jù)我已有的經(jīng)驗(yàn)來(lái)看,Lombok 最大的好處就在于通過(guò)注解的形式來(lái)簡(jiǎn)化 Java 代碼,簡(jiǎn)化到什么程度呢?
我相信你一定寫(xiě)過(guò)不少的 getter / setter,盡管可以借助 IDE 來(lái)自動(dòng)生成,可一旦 Javabean 的屬性很多,就免不了要產(chǎn)生大量的 getter / setter,這會(huì)讓代碼看起來(lái)不夠簡(jiǎn)練,就像老太婆的裹腳布一樣,又臭又長(zhǎng)。
class Cmower {private int age;private String name;private BigDecimal money;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public BigDecimal getMoney() {return money;}public void setMoney(BigDecimal money) {this.money = money;} }Lombok 可以通過(guò)注解的方式,在編譯的時(shí)候自動(dòng)為 Javabean 的屬性生成 getter / setter,不僅如此,還可以生成構(gòu)造方法、equals、hashCode,以及 toString。注意是在編譯的時(shí)候哦,源碼當(dāng)中是沒(méi)有 getter / setter 等等的。
@Getter @Setter class CmowerLombok {private int age;private String name;private BigDecimal money; }哎呀,源碼看起來(lái)苗條多了,對(duì)不對(duì)?
02、添加 Lombok 的依賴
如果項(xiàng)目使用 Maven 構(gòu)建的話,添加Lombok 的依賴就變得輕而易舉了。
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version><scope>provided</scope> </dependency>其中 scope=provided,就說(shuō)明 Lombok 只在編譯階段生效。也就是說(shuō),Lombok 會(huì)在編譯期靜悄悄地將帶 Lombok 注解的源碼文件正確編譯為完整的 class 文件。
溫馨提示:只在項(xiàng)目中追加 Lombok 的依賴還不夠,還要為 IDE 添加 Lombok 支持,否則 Javabean 的 getter / setter 就無(wú)法自動(dòng)編譯,也就不能被調(diào)用。
03、為 Eclipse 添加 Lombok 支持
第一步,下載 Lombok 的 jar 包。下載地址如下:
http://central.maven.org/maven2/org/projectlombok/lombok/1.18.6/lombok-1.18.6.jar
第二步,雙擊運(yùn)行該 jar 包。
第三步,點(diǎn)擊「Install / Update」進(jìn)行安裝。
第四步,重啟 Eclipse,完成項(xiàng)目的重新編譯。
可以通過(guò) Outline 視圖查看已經(jīng)編譯好的 getter / setter。是不是感覺(jué)很奇妙?
這時(shí)候,我們就可以使用 Lombok 注解過(guò)的 Javabean 了。
04、使用 Jad 查看 Lombok 字節(jié)碼
曾經(jīng)有一段時(shí)間,每個(gè)人選擇的反編譯工具都是 Jad。雖然 Jad 已經(jīng)死了,不再更新了,但仍然有許多人需要它。比如說(shuō)我就是其中一個(gè)。甚至在我的心目中,Jad 是最佳的 Java 反編譯工具,排名在 JD-GUI 之前。
Jad 的下載地址如下,包含各種平臺(tái)的版本:http://www.javadecompilers.com/jad
下載完成后解壓,并不需要任何的安裝步驟。怎么使用 Jad 呢?
jad CmowerLombok.class // Parsing CmowerLombok.class... Generating CmowerLombok.jad執(zhí)行完以上命令后,會(huì)生成一個(gè)新的文件,后綴為 .jad,使用文本編輯器打開(kāi)后,內(nèi)容如下:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name: CmowerLombok.javapackage com.cmower.java_demo.lombok;import java.math.BigDecimal;class CmowerLombok {CmowerLombok(){}public int getAge(){return age;}public String getName(){return name;}public BigDecimal getMoney(){return money;}public void setAge(int age){this.age = age;}public void setName(String name){this.name = name;}public void setMoney(BigDecimal money){this.money = money;}private int age;private String name;private BigDecimal money; }嘿嘿,果然 getter / setter 就在里面,這真是一件令人開(kāi)心的事情,開(kāi)心得我一巴掌拍在桌子上,差一點(diǎn)沒(méi)把手拍骨折,也不知道桌子疼不疼。
很早就有朋友勸我使用 Lombok,但我總覺(jué)得增加一個(gè)能夠產(chǎn)生任何現(xiàn)代 IDE 都能輕易產(chǎn)生的代碼的類(lèi)庫(kù)沒(méi)有多大的價(jià)值(句子有點(diǎn)長(zhǎng),注意斷句)。現(xiàn)在我再也不會(huì)這么覺(jué)得了,Lombok 為我節(jié)省了大量的生成樣板代碼的時(shí)間。
PS:需要注明一點(diǎn)的是,我首次查看 class 文件的時(shí)候遇到了巨坑,getter / setter 竟然不在其中,但是可以調(diào)用。試了很多的反編譯工具都不行。
于是我不得不在很多個(gè)群里面發(fā)起了咨詢,很多大神都請(qǐng)教了,最后的結(jié)論是 Eclipse 的 Lombok 插件可能出了 bug。為此,我還下載了程序員開(kāi)發(fā)利器——IntelliJ IDEA,但我用起來(lái)蹩手蹩腳,最后還是放棄了。
折騰了大概 3 個(gè)多小時(shí)候后,沒(méi)辦法,我只得重啟了 Eclipse(解決編譯問(wèn)題的終極殺招),class 文件中莫名其妙地又出現(xiàn)了 getter / setter(還記得我拍桌子的興奮勁嗎?)。由此我得出的結(jié)論是,不管別人有沒(méi)有寫(xiě) Lombok 的教程,自己一定要親身實(shí)踐一番。
05、使用其他反編譯工具查看 Lombok 字節(jié)碼
既然說(shuō)到反編譯工具,我覺(jué)得有必要介紹另外一款優(yōu)秀的反編譯工具——Enhanced Class Decompiler。
它將 JD、Jad、FernFlow、CFR、Procyon 與 Eclipse 無(wú)縫集成,并且允許 Java 開(kāi)發(fā)人員直接調(diào)試類(lèi)文件而不需要源代碼。這還不算完啊,它還集成了 Eclipse 類(lèi)編輯器 M2E 插件,支持 Javadoc、參考搜索、庫(kù)源附加、字節(jié)碼視圖和 JDK 8 lambda 表達(dá)式的語(yǔ)法。
總之,Enhanced Class Decompiler 要取代 Jad 在我心目中的位置了。
第一步,在 Eclipse Marketplace 搜索 jad。
第二步,直接點(diǎn)擊「Installed」按鈕進(jìn)行安裝。安裝完成后重啟 Eclipse。
第三步,右鍵 target,選擇「Show In Remote Systems View」。
第四步,右鍵需要查看的 class 文件,依次選擇「Open With」→「Class Decompiler Viewer」。
看到反編譯后的代碼如下所示。
package com.cmower.java_demo.lombok;import java.math.BigDecimal;class CmowerLombok {private int age;private String name;private BigDecimal money;public int getAge() {return this.age;}public String getName() {return this.name;}public BigDecimal getMoney() {return this.money;}public void setAge(int age) {this.age = age;}public void setName(String name) {this.name = name;}public void setMoney(BigDecimal money) {this.money = money;} }PS:如果你想把 Enhanced Class Decompiler 設(shè)置為默認(rèn)的 class 文件視圖的話,可以參照下圖哦。
06、常用的 Lombok 注解
1)@Getter / @Setter
@Getter / @Setter 用起來(lái)很靈活,比如說(shuō)像下面這樣:
class CmowerLombok {@Getter @Setter private int age;@Getter private String name;@Setter private BigDecimal money; }字節(jié)碼文件反編譯后的內(nèi)容是:
class CmowerLombok {private int age;private String name;private BigDecimal money;public int getAge() {return this.age;}public void setAge(int age) {this.age = age;}public String getName() {return this.name;}public void setMoney(BigDecimal money) {this.money = money;} }2)@ToString
打印日志的好幫手哦。
@ToString class CmowerLombok {private int age;private String name;private BigDecimal money; }字節(jié)碼文件反編譯后的內(nèi)容是:
class CmowerLombok {private int age;private String name;private BigDecimal money;public String toString() {return "CmowerLombok(age=" + this.age + ", name=" + this.name + ", money=" + this.money + ")";} }3)val
在編寫(xiě) JavaScript 代碼時(shí),我一直覺(jué)得 var 這個(gè)變量聲明類(lèi)型用起來(lái)特別方便。Lombok 也提供了一個(gè)類(lèi)似的。
class CmowerLombok {public void test() {val names = new ArrayList<String>();names.add("沉默王二");val name = names.get(0);System.out.println(name);} }字節(jié)碼文件反編譯后的內(nèi)容是:
class CmowerLombok {public void test() {ArrayList<String> names = new ArrayList();names.add("沉默王二");String name = (String) names.get(0);System.out.println(name);} }4)@Data
@Data 注解可以生成 getter / setter、equals、hashCode,以及 toString,是個(gè)總和的選項(xiàng)。
@Data class CmowerLombok {private int age;private String name;private BigDecimal money; }字節(jié)碼文件反編譯后的內(nèi)容是:
class CmowerLombok {private int age;private String name;private BigDecimal money;public int getAge() {return this.age;}public String getName() {return this.name;}public BigDecimal getMoney() {return this.money;}public void setAge(int age) {this.age = age;}public void setName(String name) {this.name = name;}public void setMoney(BigDecimal money) {this.money = money;}public boolean equals(Object o) {if (o == this) {return true;} else if (!(o instanceof CmowerLombok)) {return false;} else {CmowerLombok other = (CmowerLombok) o;if (!other.canEqual(this)) {return false;} else if (this.getAge() != other.getAge()) {return false;} else {Object this$name = this.getName();Object other$name = other.getName();if (this$name == null) {if (other$name != null) {return false;}} else if (!this$name.equals(other$name)) {return false;}Object this$money = this.getMoney();Object other$money = other.getMoney();if (this$money == null) {if (other$money != null) {return false;}} else if (!this$money.equals(other$money)) {return false;}return true;}}}protected boolean canEqual(Object other) {return other instanceof CmowerLombok;}public int hashCode() {int PRIME = true;int result = 1;int result = result * 59 + this.getAge();Object $name = this.getName();result = result * 59 + ($name == null ? 43 : $name.hashCode());Object $money = this.getMoney();result = result * 59 + ($money == null ? 43 : $money.hashCode());return result;}public String toString() {return "CmowerLombok(age=" + this.getAge() + ", name=" + this.getName() + ", money=" + this.getMoney() + ")";} }5)更多的 Lombok 注解,待你解鎖哦。
07、Lombok 的處理流程
一圖勝千言,我就先上圖了。
- javac 對(duì)源代碼進(jìn)行分析,生成一棵抽象語(yǔ)法樹(shù)(AST)
- javac 編譯過(guò)程中調(diào)用實(shí)現(xiàn)了JSR 269 的 Lombok 程序
- Lombok 對(duì) AST 進(jìn)行處理,找到 Lombok 注解所在類(lèi)對(duì)應(yīng)的語(yǔ)法樹(shù)(AST),然后修改該語(yǔ)法樹(shù),增加 Lombok 注解定義的相應(yīng)樹(shù)節(jié)點(diǎn)(所謂代碼)
- javac 使用修改后的抽象語(yǔ)法樹(shù)生成字節(jié)碼文件
總結(jié)
以上是生活随笔為你收集整理的eclipse lombok插件安装_你干啥的?Lombok的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python图像处理教程_Python基
- 下一篇: caffe源码分析:softmax_la