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)数组,数组的顺序为

你可能感兴趣的:(java)