首页  

javassist 简介     所属分类 javassist 浏览量 547
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