lombok


今天拉下來一個新springcould項目,結果一直出錯,后面才發現沒有裝lombok插件(本人小白,也是查了好久才發現的),避免下次遺忘,所以做個關於lombok小筆記,加深印象。

1.Lombok簡介

官方介紹
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

大概的意思:Lombok是一個Java庫,能自動插入編輯器並構建工具,簡化Java開發。通過添加注解的方式,不需要為類編寫getter或eques方法,同時可以自動化日志變量。

2.Lombok使用

使用Lombok需要的開發環境Java+Maven+IntelliJ IDEA或者Eclipse(安裝Lombok Plugin)

2.1添加maven依賴

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

2.2安裝插件

使用lombok是要安裝插件的,File——>settings,然后在插件中搜索安裝,詳見下圖。

 

 

2.3常用注解

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

  • @Setter 注解在類或字段,注解在類時為所有字段生成setter方法,注解在字段上時只為該字段生成setter方法。
  • @Getter 使用方法同上,區別在於生成的是getter方法。
  • @ToString 注解在類,添加toString方法。
  • @EqualsAndHashCode 注解在類,生成hashCode和equals方法。
  • @NoArgsConstructor 注解在類,生成無參的構造方法。
  • @RequiredArgsConstructor 注解在類,為類中需要特殊處理的字段生成構造方法,比如final和被@NonNull注解的字段。
  • @AllArgsConstructor 注解在類,生成包含類中所有字段的構造方法。
  • @Data 注解在類,生成setter/getter、equals、canEqual、hashCode、toString方法,如為final屬性,則不會為該屬性生成setter方法。
  • @Slf4j 注解在類,生成log變量,嚴格意義來說是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);

3.Lombok工作原理

在Lombok使用的過程中,只需要添加相應的注解,無需再為此寫任何代碼。自動生成的代碼到底是如何產生的呢?

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

  • 運行時解析

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

  • 編譯時解析

編譯時解析有兩種機制,分別簡單描述下:

1)Annotation Processing Tool

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

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

2)Pluggable Annotation Processing API

JSR 269自JDK6加入,作為apt的替代方案,它解決了apt的兩個問題,javac在執行的時候會調用實現了該API的程序,這樣我們就可以對編譯器做一些增強。

Lombok本質上就是一個實現了“JSR 269 API”的程序。在使用javac的過程中,它產生作用的具體流程如下:

  1. javac對源代碼進行分析,生成了一棵抽象語法樹(AST)
  2. 運行過程中調用實現了“JSR 269 API”的Lombok程序
  3. 此時Lombok就對第一步驟得到的AST進行處理,找到@Data注解所在類對應的語法樹(AST),然后修改該語法樹(AST),增加getter和setter方法定義的相應樹節點
  4. javac使用修改后的抽象語法樹(AST)生成字節碼文件,即給class增加新的節點(代碼塊)

通過讀Lombok源碼,發現對應注解的實現都在HandleXXX中,比如@Getter注解的實現在HandleGetter.handle()。還有一些其它類庫使用這種方式實現,比如Google Auto、Dagger等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM