JAVA中如何利用javassist實現動態程式設計
阿新 • • 發佈:2019-02-14
JAVA的動態性
- 位元組碼操作
- 反射
執行時操作位元組碼可以讓我們實現如下功能:
- 動態生成新的類
- 動態改變某個類的結構
優勢
- 比反射開銷小,效能高
- JAVAssist效能高於反射,低於ASM
使用
需匯入javassist包
//1.獲得類池
ClassPool pool = ClassPool.getDefault();
//2.建立類
CtClass ctClass = pool.makeClass("com.earnest.Emp");
//3.建立屬性
CtField name = CtField.make("private String name;" , ctClass);//屬性定義 物件
CtField age = CtField.make("private int age;", ctClass);
//4.新增屬性
ctClass.addField(name);
ctClass.addField(age);
//5.建立方法
CtMethod make = CtMethod.make("public String getName() {return name;}", ctClass);
CtMethod make1 = CtMethod.make("public void setName(String name) {this.name = name;}" , ctClass);
//6.新增方法
ctClass.addMethod(make);
ctClass.addMethod(make1);
//7.新增構造器
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);//無引數構造器
ctConstructor.setBody("{}");
CtConstructor ctConstructor1 = new CtConstructor(new CtClass[]{CtClass.intType, pool.get("java.lang.String" )}, ctClass);//指定引數構造器
ctConstructor1.setBody("{this.name=$2;this.age=$1;}");//$1代表第一個引數,$2代表第二個引數,$0代表this
//8.新增構造器
ctClass.addConstructor(ctConstructor);
ctClass.addConstructor(ctConstructor1);
//8.寫入工作空間c:/myJava
ctClass.writeFile("c:/myJava");
$0,$1,$2
:分別代表this
,第一個引數,第二個引數。
$args
:將所有引數做為陣列放入。
$$
:所有方法引數的簡寫,主要用在方法呼叫上。move(String a,String b)
相當於move($$)
。
$cflow
:一個方法呼叫的深度。
$r
:方法返回值的型別。
$_
:方法返回值。(修改方法時不支援)。
addCatch()
:方法中加入try catch
塊,$e
代表異常。
$class
:this
的型別(Class
)。也就是$0
的型別。
$sig
;方法引數的型別(Class
)陣列,陣列的順序為