最近感覺腦子就是個頻繁斷電的內存 裝進去的東西總是忘 感覺隨便寫點 方便整理筆記的時候好看。
最近研究jvm的javac過程,想寫一個方便正則的插件,便思考到lombok的原理。
在書里叫“插入式注解處理器” 但其實它可操作的不只是注解 操作普通代碼(除了代碼塊的其他“定義類型代碼”,如定義方法,定義域,定義引用包,定義類這樣的,代碼塊在ast上就一個節點,目前我也不知道怎么操作這個節點)也是可以的。總之就是操作代碼改變其ast 從而影響生成class文件
lombok有幾點我比較喜歡。
一個是有一個CleanUpRegisty,注冊了需要清理的類。
1.javac是單線程,lombok可能是先行處理class文件(這點有待推敲,怎么判斷是lombok先行還是javac先行),lombok結束之后清理掉不用的類節省下內存空間。
2.lombok分為兩塊一種是javac編譯器 一種是eclipse的編譯器 但是怎么判斷編譯器類型我沒細看 我只看了javac的編譯器插件的實現。
3.lombok用了spi,
一個是lombok代碼內部用了spi,讀一些如HandlerData之類的JavacAnnotationHander的子類,他沒有像網上那些Ser...什么的類來生成實例,而是用了反射new一個實例。
另一個是對jdk內部的javac的javax包內Processor實行了spi,這一點我還不知道具體流程,感覺很神奇,難道是javac這個項目內部就有spi讀取?
下面是最重要的
4.HandlerLibrary中的loadAnnotationHandlers中的findServices方法實現有點巧妙,此方法返回一個iterable,這個iterable還和方法內部的變量有聯系(注意lambda表達式可以使用局部變量,但是必須是final類型的或事實上final類型)。
我也寫這個插件要注意:
1.能不能跟lombok共同運行
2.最好能生成JavaDoc
3.考慮要不要merge進lombok