目前Java字節碼生成框架大致有ASM、Javassist和byte buddy三種
ASM框架介紹及使用
1.ASM介紹
ASM是一種Java字節碼操控框架,能夠以二進制形式修改已有的類或是生成類,ASM可以直接生成二進制class文件也可以在類被加載入JVM之前動態改變類,只不過ASM在創建class字節碼時說底層JVM的匯編指令,需要使用者對class組織結構和JVM匯編指令有一定的了解。由於Java 類存儲在.class文件中,這些類文件中包含有:類名稱、方法、屬性及字節碼,ASM從類文件中讀入信息后改變類行為、分析類信息或者直接創建新的類。
著名的使用到ASM的案例便是lambda表達式、CGLIB動態代理類
2.ASM內容
ASM框架核心類包含
ClassReader:該類用來解析編譯過的class字節碼文件
ClassWriter:該類用來重新構建編譯后的類,比如修改類名、屬性、方法或者根據要求創建新的字節碼文件
ClassAdapter:實現了ClassVisitor接口,將對它的方法調用委托給另一個ClassVisitor對象
3.ASM使用案例
ASM使用之前需要導入jar包asm.jar,我們來通過ASM來對一個現有的類的方法進行字節碼增強,實現在方法的開頭和結尾打印日志的功能
Javassist及使用
1.javassist介紹
Javassit相比於ASM要簡單點,Javassit提供了更高級的API,當時執行效率上比ASM要差,因為ASM上直接操作的字節碼。功能和JDK自帶的反射功能類似,但是比反射要強大。
2.javassist內容
Javassist核心類包括
ClassPool:一個基於HashMap實現的CtClass對象容器,key上類名,value上這個類的CtClass對象
CtClass:表示一個類,可以從ClassPool中獲取
CtMethods:表示一個類的方法
CtFields:表示類中的屬性
3.javassist使用案例
Byte Buddy及使用
1.byte buddy介紹
byte buddy是一個提供了API用於生成任意Java類工具包,可以生成和修改字節碼。
2.byte buddy使用案例