Javassist之使用字節碼在運行時生成新的類 01

介紹java

  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>

 

源碼:this

 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文件編碼

相關文章
相關標籤/搜索