Javassist是一個開源的分析、編輯和創(chuàng)建Java字節(jié)碼的類庫,可以直接編輯和生成Java生成的字節(jié)碼。相對于bcel, asm等這些工具,開發(fā)者不需要了解虛擬機(jī)指令,就能動態(tài)改變類的結(jié)構(gòu),或者動態(tài)生成類。javassist簡單易用, 快速。
創(chuàng)新互聯(lián)建站IDC提供業(yè)務(wù):成都服務(wù)器托管,成都服務(wù)器租用,成都服務(wù)器托管,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動機(jī)房,聯(lián)通機(jī)房。重要的類
1. ClassPool:javassist的類池,使用ClassPool 類可以跟蹤和控制所操作的類,它的工作方式與 JVM 類裝載器非常相似
2. CtClass: CtClass提供了類的操作,如在類中動態(tài)添加新字段、方法和構(gòu)造函數(shù)、以及改變類、父類和接口的方法。
3. CtField:類的屬性,通過它可以給類創(chuàng)建新的屬性,還可以修改已有的屬性的類型,訪問修飾符等
4. CtMethod:類中的方法,通過它可以給類創(chuàng)建新的方法,還可以修改返回類型,訪問修飾符等, 甚至還可以修改方法體內(nèi)容代碼
5. CtConstructor:與CtMethod類似
在這里小編建了一個前端學(xué)習(xí)交流扣扣群:132667127,我自己整理的最新的前端資料和高級開發(fā)教程,如果有想需要的,可以加群一起學(xué)習(xí)交流
API運用
ClassPool
1 // 類庫, jvm中所加載的class
2 ClassPool pool = ClassPool.getDefault();
3 // 加載一個已知的類, 注:參數(shù)必須為全量類名
4 CtClass ctClass = pool.get("com.itheima.Student");
5 // 創(chuàng)建一個新的類, 類名必須為全量類名
6 CtClass tClass = pool.makeClass("com.itheima.Calculator");
CtField
1 // 獲取已知類的屬性
2 CtField ctField = ctClass.getDeclaredField("name");
3 // 構(gòu)建新的類的成員變量
4 CtField ctFieldNew = new CtField(CtClass.intType,"age",ctClass);
5 // 設(shè)置類的訪問修飾符為public
6 ctFieldNew.setModifiers(Modifier.PUBLIC);
7 // 將屬性添加到類中
8 ctClass.addField(ctFieldNew);
CtMethod
1 // 獲取已有方法
4 //創(chuàng)建新的方法, 參數(shù)1:方法的返回類型,參數(shù)2:名稱,參數(shù)3:方法的參數(shù),參數(shù)4:方法所屬的類
5 CtMethod ctMethod = new CtMethod(CtClass.intType, "calc", new CtClass[]
{CtClass.intType,CtClass.intType}, tClass);
6 // 設(shè)置方法的訪問修飾
7 ctMethod.setModifiers(Modifier.PUBLIC);
8 // 將新建的方法添加到類中
9 ctClass.addMethod(ctMethod);
10 // 方法體內(nèi)容代碼 $1代表第一個參數(shù),$2代表第二個參數(shù)
11 ctMethod.setBody("return $1 + $2;");
2 CtMethod ctMethod = ctClass.getDeclaredMethod("sayHello");
CtConstructor
// 獲取已有的構(gòu)造方法, 參數(shù)為構(gòu)建方法的參數(shù)類型數(shù)組
CtConstructor ctConstructor = ctClass.getDeclaredConstructor(new CtClass[]{});
// 創(chuàng)建新的構(gòu)造方法
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{CtClass.intType},ctClass); ctConstructor.setModifiers(Modifier.PUBLIC);
ctConstructor.setBody("this.age = $1;");
ctClass.addConstructor(ctConstructor);
// 也可直接創(chuàng)建
ctConstructor = CtNewConstructor.make("public Student(int age){this.age=age;}", ctClass);
1. 創(chuàng)建maven工程并添加依賴