一、功能
1、动态生成新的类
2、动态改变某个类的结构(添加、删除、修改 新的属性、方法)
二、优势
1、比反射开销小,性能高
2、JAVAasist性能高于反射,低于ASM
使用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() { } }
原文:https://www.cnblogs.com/lhl0131/p/12360589.html