1. 程式人生 > >Javassist之使用位元組碼在執行時生成新的類 01

Javassist之使用位元組碼在執行時生成新的類 01

介紹

  Javassist是一個開源的分析、編輯和建立Java位元組碼的類庫。是由東京工業大學的數學和計算機科學系的 Shigeru Chiba (千葉 滋)所建立的。它已加入了開放原始碼JBoss 應用伺服器專案,通過使用Javassist對位元組碼操作為JBoss實現動態"AOP"框架。

  關於java位元組碼的處理,目前有很多工具,如bcel,asm。不過這些都需要直接跟虛擬機器指令打交道。如果你不想了解虛擬機器指令,可以採用javassist。javassist是jboss的一個子專案,其主要的優點,在於簡單,而且快速。直接使用java編碼的形式,而不需要了解虛擬機器指令,就能動態改變類的結構,或者動態生成類。

 

依賴包:

        <!--javassist-->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.23.1-GA</version>
        </dependency>

 

原始碼:

 1 package
org.study2.JavaSenior.annotation.javassistDemo; 2 3 import javassist.*; 4 5 /** 6 * @Auther:GongXR 7 * @Date:2018/10/30 8 * @Description: 使用位元組碼在執行時生成新的類 (javassist工具類) 9 **/ 10 public class JavassistDemo1 { 11 public static void main(String[] args) throws Exception { 12 ClassPool pool = ClassPool.getDefault();
13 CtClass cc = pool.makeClass("com.test.Emp"); 14 15 //建立屬性 16 CtField f1 = CtField.make("private int empno;", cc); 17 CtField f2 = CtField.make("private String ename;", cc); 18 cc.addField(f1); 19 cc.addField(f2); 20 21 //建立方法 22 CtMethod m1 = CtMethod.make("public int getEmpno(){return empno;}", cc); 23 CtMethod m2 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;}", cc); 24 cc.addMethod(m1); 25 cc.addMethod(m2); 26 27 //新增構造器 28 CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType, pool.get("java.lang.String")}, cc); 29 constructor.setBody("{this.empno=empno; this.ename=ename;}"); 30 cc.addConstructor(constructor); 31 32 cc.writeFile("C:/Temp"); //將上面構造好的類寫入到:/Temp中 33 System.out.println("生成類,成功!"); 34 } 35 }

 

在"C:/Temp"下生產對應的class檔案