Java之Lombok

背景

  我們在開發過程中,通常都會定義大量的JavaBean,然後通過IDE去生成其屬性的構造器、getter、setter、equals、hashcode、toString方法,當要對某個屬性進行改變時,比如命名、類型等,都需要重新去生成上面提到的這些方法,那Java中有沒有一種方式能夠避免這種重複的勞動呢?答案是有,我們來看一下下面這張圖,右面是一個簡單的JavaBean,只定義了兩個屬性,在類上加上了@Data,從左面的結構圖上可以看到,已經自動生成了上面提到的方法。 
這裏寫圖片描述

Lombok簡介

  Lombok是一個可以通過簡單的註解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應的註解,可以在編譯源碼的時候生成對應的方法。官方地址:https://projectlombok.org/,github地址:https://github.com/rzwitserloot/lombok

Lombok使用

環境

# #
Maven, Ivy or Gradle Lombok is in maven central. More…
Javac Just put lombok.jar on the classpath.
NetBeans Just put lombok.jar on the classpath and enable annotation processing. More…
Eclipse and variants Run lombok.jar as a java app (i.e. doubleclick it, usually) to install. Also add lombok.jar to your project. Supported variants: Springsource Tool Suite, JBoss Developer Studio
IDEA IntelliJ A plugin developed by Michael Plushnikov adds support for most features.
Javadoc First delombok your code then run javadoc on the result. More…
Android The proper way to use lombok with android is somewhat complicated but possible. More…
GWT Lombok works with GWT. More…
Play! Framework Use Aaron Freeman’s lombok play plugin.
ecj Lombok works on ecj and ecj-based tools. More…

https://projectlombok.org/download.html

註解介紹

  下面只是介紹了幾個常用的註解,更多的請參見https://projectlombok.org/features/index.html

@Getter / @Setter

  可以作用在類上和屬性上,放在類上,會對所有的非靜態(non-static)屬性生成Getter/Setter方法,放在屬性上,會對該屬性生成Getter/Setter方法。並可以指定Getter/Setter方法的訪問級別。

@EqualsAndHashCode

  默認情況下,會使用所有非瞬態(non-transient)和非靜態(non-static)字段來生成equals和hascode方法,也可以指定具體使用哪些屬性。

@ToString

  生成toString方法,默認情況下,會輸出類名、所有屬性,屬性會按照順序輸出,以逗號分割。

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

  無參構造器、部分參數構造器、全參構造器,當我們需要重載多個構造器的時候,Lombok就無能爲力了。

@Data

  @ToString, @EqualsAndHashCode, 所有屬性的@Getter, 所有non-final屬性的@Setter和@RequiredArgsConstructor的組合,通常情況下,我們使用這個註解就足夠了。

Lombok原理

  瞭解了簡單的使用之後,現在應該比較好奇它是如何實現的。整個使用的過程中,只需要使用註解而已,不需要做其它額外的工作,那玄妙之處應該是在註解的解析上。JDK5引入了註解的同時,也提供了兩種解析方式。

運行時解析

  運行時能夠解析的註解,必須將@Retention設置爲RUNTIME,這樣可以通過反射拿到該註解。java.lang.reflect反射包中提供了一個接口AnnotatedElement,該接口定義了獲取註解信息的幾個方法,Class、Constructor、Field、Method、Package等都實現了該接口,大部分開發者應該都很熟悉這種解析方式。

boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
<T extends Annotation> T getAnnotation(Class<T> annotationClass);
Annotation[] getAnnotations();
Annotation[] getDeclaredAnnotations();
  • 1
  • 2
  • 3
  • 4

編譯時解析

編譯時解析有兩種機制,網上很多文章都把它倆搞混了,分別簡單描述一下。

Annotation Processing Tool

  apt自JDK5產生,JDK7已標記爲過期,不推薦使用,JDK8中已徹底刪除,自JDK6開始,可以使用Pluggable Annotation Processing API來替換它,apt被替換主要有2點原因:

  • api都在com.sun.mirror非標準包下
  • 沒有集成到javac中,需要額外運行

  apt的更多介紹可以參見這裏

Pluggable Annotation Processing API

  JSR 269,自JDK6加入,作爲apt的替代方案,它解決了apt的兩個問題,javac在執行的時候會調用實現了該API的程序,這樣我們就可以對編譯器做一些增強,這時javac執行的過程如下: 
這裏寫圖片描述 
  Lombok就是使用這種方式實現的,有興趣的話可以去看看其Lombok源碼,對應註解的實現都在HandleXXX中,比如@Getter註解的實現是HandleGetter.handle()。還有一些其它類庫使用這種方式實現,比如Google AutoDagger等等。

Lombok問題

  • 無法支持多種參數構造器的重載
  • 奇淫巧技,使用會有爭議


Eclipse插件安裝

    • 1.下載lombok.jar包https://projectlombok.org/download.html

    • 2.運行Lombok.jar: java -jar D:\software\lombok.jar D:\software\lombok.jar這是windows下lombok.jar所在的位置

        數秒後將彈出一框,以確認eclipse的安裝路徑</code>
    • 3.確認完eclipse的安裝路徑後,點擊install/update按鈕,即可安裝完成

    • 4.安裝完成之後,請確認eclipse安裝路徑下是否多了一個lombok.jar包,並且其

      配置文件eclipse.ini中是否 添加了如下內容: </code>
          -javaagent:lombok.jar 
          -Xbootclasspath/a:lombok.jar 
      那麼恭喜你已經安裝成功,否則將缺少的部分添加到相應的位置即可 </code>
    • 5.重啓eclipse或myeclipse




引用

http://notatube.blogspot.fr/2010/11/project-lombok-trick-explained.html 
http://www.lteconsulting.fr/annotation-processing 
http://hannesdorfmann.com/annotation-processing/annotationprocessing101 
http://docs.oracle.com/javase/7/docs/technotes/guides/apt/GettingStarted.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章