@(Java知识点总结)[Java, 动态字节码操做]java
运行时操做字节码可让咱们实现以下功能:数组
是一个强大的,高性能,高质量的 Code框架
是 一个开源的分析、编辑和建立 Java 字节码 的类库 。性能较 ASM 差,跟 cglib 差很少,可是使用简单。不少开源框架都在使用它 。工具
主页:http://www.csg.ci.i.u-tokyo.ac.jp/~ chiba/javassist
使用Javassist须要使用javassist.jar性能
AOP:this
javassist 的最外层的 API 和 JAVA 的反射包中的 API 颇为相似 。spa
它主要由 CtClass , CtMethod, ,以及 CtField 几个类组成。用以执行和 JDK 反射 API 中 java.lang.Class , java.lang.reflect.Method , java.lang.reflect.Method .Field 相同的 操做 。code
示例:blog
import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtField; import javassist.CtMethod; /** * 建立一个新的类 * @author Administrator * */ public class Test10 { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); // 类池 CtClass class1 = pool.makeClass("com.gs.Emp"); //建立属性 CtField f1 = CtField.make("private int num;", class1); CtField f2 = CtField.make("private String name;", class1); class1.addField(f1); class1.addField(f2); //建立方法 CtMethod setName = CtMethod.make("public void setName(String name){this.name = name;}", class1); CtMethod getName = CtMethod.make("public String getName(){return name;}", class1); class1.addMethod(setName); class1.addMethod(getName); //添加构造器。 若是是带参构造器,须要传递参数类型,基本数据类型用CtClass获取,引用类型,须要用pool获取 CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, class1); constructor.setBody("{this.num = num;this.name = name;}"); //构造器的方法体 class1.writeFile("E:/myjava"); //将上面写好的类,写入到这个工做空间中 System.out.println("生成类成功!"); } }
执行结果:
生成类成功!继承
使用反编译工具xjad打开: