本文采用知识共享 署名-相同方式共享 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();
}
}