1. 程式人生 > >JAVA中如何利用javassist實現動態程式設計

JAVA中如何利用javassist實現動態程式設計

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)陣列,陣列的順序為