標籤:addm ssi spool size 測試 相關 desktop rar main
java動態性的兩種常見的實現方式:
①位元組碼操作
②反射
運行時操作位元組碼可以讓我們實現如下功能:
①動態產生新的類
②動態改變某個類的結構(添加、刪除、修改 新的屬性或方法)
優點:
比反射的開銷小,效能高
Javassist效能高於反射,低於ASM
BCEL(Byte Code Engineering Library):
是java classworking 廣泛使用的一種架構,它可以讓你深入JVM組合語言進行類操作的細節。BCEL與Javassist有不同的處理位元組碼的方法,BCEL在實際的JVM指令層次上進行操作(BCEL擁有豐富的JVM指令級支援)而javassist所強調的是原始碼層級的工作。
ASM:
是一個輕量級java位元組碼操作架構,直接涉及到JVM底層的操作和指令。
CGLIB(Code Generation Library):
是一個強大的,高效能,高品質的code產生類庫,基於ASM實現。
javassist:
是一個開源的分析、編輯和建立java位元組碼的類庫。效能比ASM差,與cglib差不多,但是使用簡單,很多開源架構都在使用。
匯入javassist.jar包:
1 /** 2 * 3 * 測試使用javassist產生一個新的類 4 * 5 * @author Zhang XiaoDao 6 * 7 */ 8 public class Demo01 { 9 public static void main(String[] args) throws Exception {10 //擷取預設的類池11 ClassPool pool = ClassPool.getDefault();12 //需要建立的類13 CtClass cc = pool.makeClass("com.zzp.bean.Emp");14 15 //建立屬性,也可以給屬性賦值16 CtField f1 = CtField.make("private int empno", cc);17 CtField f2 = CtField.make("private String ename", cc);18 cc.addField(f1);19 cc.addField(f2);20 21 //建立相關的方法22 //建立set/get方法23 CtMethod.make("public int getEmpno(){return empno;}", cc);24 CtMethod.make("public void setEmpno(int empno){this.empno = empno;}", cc);25 26 CtMethod m1 = CtMethod.make("public String getEname(){return ename;}", cc);27 CtMethod m2 = CtMethod.make("public void setEname(String ename){this.ename = ename;}", cc);28 cc.addMethod(m1);29 cc.addMethod(m2);30 31 //添加構造器32 CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")33 },cc);34 //設定構造器的方法體,method也能設定方法體35 constructor.setBody("{this.empno=empno; this.ename=ename;}");36 cc.addConstructor(constructor);37 38 //將上面寫好的類產生到案頭39 cc.writeFile("c:/desktop");40 System.out.println("產生類成功");41 }42 }
第五篇 java位元組碼操作