1. 程式人生 > >lombok使用,簡化程式碼

lombok使用,簡化程式碼

背景

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

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
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
ecj Lombok works on ecj and ecj-based tools. More…

註解介紹

@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<? extendsAnnotation> annotationClass);
<TextendsAnnotation> TgetAnnotation(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問題

  • 無法支援多種引數構造器的過載
  • 奇淫巧技,使用會有爭議

引用