@(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打開: