本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

Javassist

Javaassist 是 Java 提供用于操作字节码的库。
即使 JDK11 后,反射的效率依旧很糟糕,Javaassist 可以用硬编码的方式,解决反射生成实例时,频繁反射带来的效率问题。

例子:

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtMethod;

import java.util.concurrent.locks.ReentrantLock;

public class JavassistDemo {

    public static void main(String[] args) throws Exception {
        ClassPool classPool = ClassPool.getDefault();

        // Import package
        classPool.importPackage("java.util.concurrent.*");

        // Make class, set parent class
        CtClass parentCtClass = classPool.getCtClass(ReentrantLock.class.getName());
        CtClass warsLockClass = classPool.makeClass("WarsLock", parentCtClass);

        // Make constructor, set params and target class
        CtConstructor constructor = new CtConstructor(new CtClass[0], warsLockClass);
        constructor.setBody("{}");
        warsLockClass.addConstructor(constructor);
        // Make method
        warsLockClass.addMethod(CtMethod.make("void lock() { System.out.println(\"123~\"); }", warsLockClass));
        // Make instance
        Class<?> lockClass = warsLockClass.toClass();
        ReentrantLock lock = (ReentrantLock) lockClass.getDeclaredConstructor().newInstance();

        lock.lock();
    }
}