Javassist:
- Javassist (Java編程助手)使操作Java字節碼變得簡單。它是一個用於編輯Java字節碼的類庫;跟其他類似的字節碼編輯器不同的是,它使Java程序能夠在運行時定義一個新類,並在JVM加載類文件時修改它。
- Javassist提供了兩種級別的API:源級別和字節碼級別。如果用戶使用源代碼級API,他們可以不需要了解Java字節碼的規范的前提下編輯類文件。整個API僅使用Java語言的詞匯表設計。甚至你可以以源文本的形式插入字節碼中;Javassist動態編譯它。另一方面,字節碼級API允許用戶作為編輯器直接編輯類文件。
- Javassist允許您檢查、編輯和創建Java二進制類。
- Javassist並不是唯一處理字節碼的庫,但它有一個特別功能,使其成為一個重要的開始來嘗試字節碼工作:你可以使用Javassist改變一個Java類的字節碼而不需要學習任何關於字節碼或Java虛擬機(JVM)的體系結構。
- 面向切面編程:Javassist可以是一個很好的工具用於向類中添加新方法,以及在調用方和被調用方兩邊插入before/after/around通知。
- 反射:Javassist另一個應用就是運行時反射;Javassist允許Java程序使用一個元對象,該元對象控制基級別對象上的方法調用。不需要專門的編譯器或虛擬機。
- Javassist還提供了用於直接編輯類文件的低級API。要使用此級別的API,您需要詳細了解Java字節碼和類文件格式,而此級別的API允許您對類文件進行任何類型的修改。
ASM
- ASM是一個通用的Java字節碼操作和分析框架。它可以直接以二進制形式修改現有類或動態生成類。提供了通用的轉換和分析算法,允許輕松地組裝定制的復雜轉換和代碼分析工具。
- ASM提供了與其他字節碼框架類似的功能,但它關注的是使用的簡單性和性能。因為它的設計和實現盡可能的小和快,所以它非常適合在動態系統中使用。
- ASM是一個Java類操作工具,用於動態生成和操作Java類,這是實現可適應系統的有用技術。ASM基於一種新的方法,與現有的相似工具相比,后者包括使用“訪問者”設計模式,而不顯式地用對象表示被訪問的樹。對於大多數實際需求,這種新方法比現有的工具提供了更好的性能。
Javassist & ASM 對比
- Javassist源代碼級API比ASM中實際的字節碼操作更容易使用
- Javassist在復雜的字節碼級操作上提供了更高級別的抽象層。Javassist源代碼級API只需要很少的字節碼知識,甚至不需要任何實際字節碼知識,因此實現起來更容易、更快。
- Javassist使用反射機制,這使得它比運行時使用Classworking技術的ASM慢。
- 總的來說ASM比Javassist快得多,並且提供了更好的性能。Javassist使用Java源代碼的簡化版本,然后將其編譯成字節碼。這使得Javassist非常容易使用,但是它也將字節碼的使用限制在Javassist源代碼的限制之內。
- 總之,如果有人需要更簡單的方法來動態操作或創建Java類,那么應該使用Javassist API 。如果需要注重性能地方,應該使用ASM庫。
類構造時間
Framework | First time | Later times |
---|---|---|
Javassist | 257 | 5.2 |
ASM | 62.4 | 1.1 |
表結果表明ASM確實比其他框架更快,這一優勢既適用於啟動時間,也適用於重復使用。
鏈接:https://www.jianshu.com/p/f2a4c7d3745d