背景
最近接觸的幾個工程中Lombok插件出現頻率比較高,趁機了解一下原理。
簡要說明:
受益於JSR 269 API,程序可以在編譯階段對AST進行節點的操作,從而注入相關的功能結點,從而包含在最終的字節碼文件里。
優點:
- 減少了coding過程中的一些Getter/Setter等代碼的生成。
缺點:
- 代碼可讀性差;
- 代碼調試不方便;
- IDE需要插件支持。
總結:
- 整體而言,個人認為使用lombok弊大於利,不建議使用;
- JSR 269是個比較有意思的東西,做一些分析類的工具應該有幫助。
擴展思考:
Spring AOP的部分是否可以使用JSR 269原理生成字節碼,而不是運行時動態生成呢?
我認為是可以的,Spring的AOP是基於動態代理實現的,根據實際場景和具體配置不同有JDK原生動態代理和Cglib兩種不同的實現。在Spring之前就已經有AOP的成熟實現了,而且也是在編譯期使用字節碼織入的方式,思路與lombok一致,那就是大名鼎鼎的AspectJ了,現在Spring中還沿用着它的AOP注解和語法。
不過AspectJ在JDK5就有了,那個時候JSR269還沒出現,所以它並不是使用這種方式實現的。
看了下AspectJ的使用,發現跟lombok一樣,需要IDE支持,增強的部分要寫一些代碼。但是如果沒有Spring的話,我很樂意使用AspectJ來實現AOP的使用,因為給代碼開發維護帶來的便利和靈活性非常高,總體而言,利大於弊。