字节码操作、javassist使用
一、功能
1、动态生成新的类
2、动态改变某个类的结构(添加、删除、修改 新的属性、方法)
二、优势
1、比反射开销小,性能高
2、JAVAasist性能高于反射,低于ASM
使用javassist生成一个新的类
javassist入门:
package cn.lhl.test;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
/**
* 测试使用javassist生成一个新的类
*
* @author Administrator
*
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass("cn.lhl.bean.Emp");
//源码操作
//创建属性
CtField f1 = CtField.make("private int empno;", cc);
CtField f2 = CtField.make("private String ename;", cc);
cc.addField(f1);
cc.addField(f2);
//创建方法
CtMethod m1 = CtMethod.make("public int getEmpno(){return empno;}", cc);
CtMethod m2 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;})", cc);
cc.addMethod(m1);
cc.addMethod(m2);
//添加构造器
CtConstructor constructor = new CtConstructor(new CtClass[] {CtClass.intType,
pool.get("java.lang.String")},cc);
constructor.setBody("{this.empno=empno;this.ename=ename;}");
cc.addConstructor(constructor);
//将上面构造好的类写入到f:/myjava中
cc.debugWriteFile("f:/myjava");
System.out.println("生成类");
}
}
emp类:
package cn.lhl.test;
public class Emp {
private int empno;
private String ename;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Emp(int empno, String ename) {
super();
this.empno = empno;
this.ename = ename;
}
public Emp() {
}
}

浙公网安备 33010602011771号