介绍
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss
关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。 依赖包: 源码: 在"C:/Temp"下生产对应的class文件 <!--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 }