Javassist/ASM 框架比較


Javassist:

  1. Javassist (Java編程助手)使操作Java字節碼變得簡單。它是一個用於編輯Java字節碼的類庫;跟其他類似的字節碼編輯器不同的是,它使Java程序能夠在運行時定義一個新類,並在JVM加載類文件時修改它。
  2. Javassist提供了兩種級別的API:源級別和字節碼級別。如果用戶使用源代碼級API,他們可以不需要了解Java字節碼的規范的前提下編輯類文件。整個API僅使用Java語言的詞匯表設計。甚至你可以以源文本的形式插入字節碼中;Javassist動態編譯它。另一方面,字節碼級API允許用戶作為編輯器直接編輯類文件。
  3. Javassist允許您檢查、編輯和創建Java二進制類。
  4. Javassist並不是唯一處理字節碼的庫,但它有一個特別功能,使其成為一個重要的開始來嘗試字節碼工作:你可以使用Javassist改變一個Java類的字節碼而不需要學習任何關於字節碼或Java虛擬機(JVM)的體系結構。
  5. 面向切面編程:Javassist可以是一個很好的工具用於向類中添加新方法,以及在調用方和被調用方兩邊插入before/after/around通知。
  6. 反射:Javassist另一個應用就是運行時反射;Javassist允許Java程序使用一個元對象,該元對象控制基級別對象上的方法調用。不需要專門的編譯器或虛擬機。
  7. Javassist還提供了用於直接編輯類文件的低級API。要使用此級別的API,您需要詳細了解Java字節碼和類文件格式,而此級別的API允許您對類文件進行任何類型的修改。

ASM

  1. ASM是一個通用的Java字節碼操作和分析框架。它可以直接以二進制形式修改現有類或動態生成類。提供了通用的轉換和分析算法,允許輕松地組裝定制的復雜轉換和代碼分析工具。
  2. ASM提供了與其他字節碼框架類似的功能,但它關注的是使用的簡單性和性能。因為它的設計和實現盡可能的小和快,所以它非常適合在動態系統中使用。
  3. ASM是一個Java類操作工具,用於動態生成和操作Java類,這是實現可適應系統的有用技術。ASM基於一種新的方法,與現有的相似工具相比,后者包括使用“訪問者”設計模式,而不顯式地用對象表示被訪問的樹。對於大多數實際需求,這種新方法比現有的工具提供了更好的性能。

Javassist & ASM 對比

  1. Javassist源代碼級API比ASM中實際的字節碼操作更容易使用
  2. Javassist在復雜的字節碼級操作上提供了更高級別的抽象層。Javassist源代碼級API只需要很少的字節碼知識,甚至不需要任何實際字節碼知識,因此實現起來更容易、更快。
  3. Javassist使用反射機制,這使得它比運行時使用Classworking技術的ASM慢。
  4. 總的來說ASM比Javassist快得多,並且提供了更好的性能。Javassist使用Java源代碼的簡化版本,然后將其編譯成字節碼。這使得Javassist非常容易使用,但是它也將字節碼的使用限制在Javassist源代碼的限制之內。
  5. 總之,如果有人需要更簡單的方法來動態操作或創建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


免責聲明!

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



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