javassist 简介
所属分类 javassist
浏览量 566
Javassist makes Java bytecode manipulation simple.
It is a class library for editing bytecodes in Java.
动态生成字节码 ASM Javassist
ASM
直接操作字节码指令,执行效率高,使用者掌握Java类字节码文件格式及指令
Javassist
提供更高级的API,执行效率相对较差,无需掌握字节码指令的知识
Javassist 分析、编辑和创建Java字节码
核心类 ClassPool CtClass CtMethod CtField
ClassPool 基于HashMap实现的CtClass对象容器,key 是类名称,值是表示该类的CtClass对象
CtClass 表示一个类
CtMethods 表示类中的方法
CtFields 表示类中的字段
package dyyx.demo.javassist;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtNewMethod;
public class JavassistDemo {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("dyyx.demo.javassist.Pet");
CtField nameField = new CtField(pool.getCtClass("java.lang.String"), "name", ctClass);
nameField.setModifiers(Modifier.PRIVATE);
ctClass.addField(nameField);
CtField ageField = new CtField(pool.getCtClass("int"), "age", ctClass);
ageField.setModifiers(Modifier.PRIVATE);
ctClass.addField(ageField);
ctClass.addMethod(CtNewMethod.getter("getName", nameField));
ctClass.addMethod(CtNewMethod.setter("setName", nameField));
ctClass.addMethod(CtNewMethod.getter("getAge", ageField));
ctClass.addMethod(CtNewMethod.setter("setAge", ageField));
// 构造器
CtConstructor ctConstructor = new CtConstructor(new CtClass[] {}, ctClass);
String body = new StringBuilder("{\nthis.age = 3;\nthis.name = \"tiger\";\n}").toString();
ctConstructor.setBody(body);
ctClass.addConstructor(ctConstructor);
Class> clazz = ctClass.toClass();
Object obj = clazz.newInstance();
System.out.println(obj.getClass());
Method method = obj.getClass().getMethod("getName", new Class[] {});
System.out.println("name=" + method.invoke(obj, new Object[] {}));
method = obj.getClass().getMethod("getAge", new Class[] {});
System.out.println("age=" + method.invoke(obj, new Object[] {}));
}
}
https://gitee.com/dyyx/hellocode/blob/master/demo/springboot1.5.4demo/src/main/java/dyyx/demo/javassist/JavassistDemo.java
上一篇
下一篇
Mockito mock 和 spy 区别
mock 与 字节码生成工具
spring web 注解
Redis 性能监控指标
JVM知识点汇总
go压测工具 go-stress-testing