Java無可匹敵的變身裝備,鋼鐵俠客的絕密味道

原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。java

我討厭寫一些業務代碼,不只僅由於它們的原始意圖不是我設計的,成功了是產品的功勞,失敗了代碼要背鍋。一個重要的緣由,就是重複的代碼太多,一個複雜的業務邏輯要找到它的Bug,也要下一番「苦力」。這裏說的真的是苦力,而不是腦力,說明了大部分是低劣的重複勞動。哦哦哦,我居然違背了精英主義​論調。程序員

因此隨着在項目中有了話語權,我會特別善待這些可憐的同窗們。一個問題,直到發現的時候,才發現它的低級,但中間的曲折,不多有人能看到,一個非技術出身的管理者對此就很難理解。職位越是高,就越關注總體的目標達成,對個體的感覺卻關注的不多,這不是一個好的現象。千里之堤,潰於蟻穴。普通研發的總體水平表明瞭公司的競爭力。微信

扯遠了。下面介紹幾個開發中經常使用的工具包,能夠在Java源文件、語法樹、字節碼之間進行轉換。用好了它們,不只僅能實現一些黑科技,還能大大提升咱們的生產力。架構

一、JavaPoet

有時候,咱們要作一些代碼生成工具,須要生成一些Java類源文件。若是使用字符串去拼接的話,很容易拼的亂七八糟。爲了解放雙手,就可使用工具JavaPoet進行方法或者代碼塊的構建。它還提供了佔位符等一系列方便的操做,使得你生成的代碼優美可讀,清脆爽口。併發

特別在寫一些框架的時候,能夠將一些很是髒、很是累的活兒交給它。框架

代碼示例。高併發

MethodSpec main = MethodSpec.methodBuilder("main")
                .addStatement("int total = 0")
                .beginControlFlow("for(int i=0;i<10;i++)")
                .addStatement("total +=i;")
                .endControlFlow()
                .build();
複製代碼

二、JavaCC

JavaCC是一個語法生成器和語法分析器,能夠經過讀取一個.jj(它是雞雞我是姐姐)描述文件來生成一個Java文件。聽起來和JavaPoet同樣,但它是語法層面的,過程是翻譯而不是「構造」,和咱們學習的編譯原理是一個層面的東西。並且JavaCC生成的文件通常是不可讀的,誰讓它和yacc以及lex比較像呢。工具

若是你想要自定義一些表達式,或者作一個特殊格式的解析器,你可能會用到它。學習

與此相似的還有ANTLR。應用方面,Velocity和FreeMarker都使用JavaCC做爲語法解釋器;Hibernate則使用ANTLR做爲HQL的語法解釋器。開發工具

不過我仍是更喜歡Ragel(不是Java的)多一些。對於這些場景來講,文件生成之後就再也不依賴這些工具了,仍是高效和好用更重要。

二、Javaparser

上面是經過語法樹生成Java文件(或者其餘文件),Javaparser是經過Java文件生成語法樹(AST),而後基於這棵語法樹進行Java代碼的分析和修改。注意,它能夠直接再根據語法樹,反向生成Java文件哦。

根據這棵語法樹,你能夠直接分析一個獨立的Java文件,即便這個Java文件亂七八糟,不能經過編譯,不用在運行時使用反射等功能。配合JavaPoet能夠去作一些很是有意思的功能。好比,Javaparser提取Java文件的註釋或者註解,而後經過JavaPoet生成一些自動文檔(Swagger),或者進行測試用例的自動填充。

除了這些,Javaparser能夠規定十分嚴格的語法格式,因此使用它作一個代碼審查工具,甚至是作一些代碼依賴分析,也是能夠的。

四、Lombok

其實這只是個輔助開發工具,應該有不少研發用起來了,它能夠顯著的減小代碼量。讓咱們擺脫惱人的get、set、hashCode、equals,甚至log等。

Lombok其實部分上和上面說到的Javaparser相似,不過它是JDK層面的。

在javac將Java文件解析成抽象語法樹以後(AST),Lombok則根據本身的註解處理器,動態的修改AST,增長新的節點代碼。而後,生成咱們最終的字節碼。

這個技術,是由javac的註解API來實現的(JSR-269),可讓javac在編譯期去幹一些事情。

JDK作的工做,遠比咱們表面上用到的那些多的多。

五、ByteBuddy

上面幾個工具都是把一些其餘方式的代碼轉化爲Java源文件,這些Java源文件還須要通過編譯這道工序,纔可以被真正使用。

ByteBuddy能夠更進一步,直接動態生成Java類。對,就是直接加載在元空間的那種,在程序運行期間就能夠動態的對class進行更改。不須要曲徑通幽,直達目的。

它的底層是ASM,因此ByteBuddy是能夠直接修改字節碼的,是一種字節碼加強工具

於此相似的工具還有JAVASIST、CGLiB等。

若是你在作一些代理類的工做,或者作一些APM等,想要實現相似Aspectj之類的功能,再或者相似Arthas那樣的故障排查工具,那這些工具正適合。

End

以上幾個工具包,有些是比較偏門的,但它們完成的功能卻很是酷炫。不只酷炫,並且很是有用。在領導們頻繁開會,使用各類方法論探討怎麼管理文檔,怎麼自動化,怎麼代碼審查的時候,你就已經把功能完成了。

別告訴他們!

做者簡介:小姐姐味道 (xjjdog),一個不容許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不同的味道。個人我的微信xjjdog0,歡迎添加好友,​進一步交流。​

相關文章
相關標籤/搜索