gpt4 book ai didi

java - 我们可以使用javassist创建实例对象而不使用反射吗?

转载 作者:行者123 更新时间:2023-12-02 00:57:32 27 4
gpt4 key购买 nike

如何在不使用反射 API 的情况下使用 javassist 创建实例对象?

Class cls = Class.forName("className");
Object obj = cls.getConstructor().newInstance();

CtClass ctClass = cp.get("className");

如何在不使用反射 API 的情况下获取 ctClass 的实例。

最佳答案

像 javassist 这样的库不是用于反射的,而是用于在运行时生成/修改代码(修改已加载的类需要进行检测)或在类加载之前,但是......您仍然可以使用这样的库来生成代码将调用一些方法,因此最后您将执行与反射类似的操作并动态调用某些方法,但您仅限于可以访问的方法,因此大多数情况下只能是公共(public)方法。 (如果使用 java 9,则通过在同一个包+模块中定义类来调用受包保护的包,但我将在这里跳过这个)另外,最后您仍然需要使用反射 - 创建生成类的新实例这将创建其他类的实例而无需反射。

在很多情况下,做这样的事情是毫无意义的(虽然避​​免反射可能会节省你一些执行时间,但在大多数情况下这是不值得的,而且第一次调用会特别慢)。但如果你坚持,那么你就可以:

public class Test {
public static void main(String[] args) throws Exception {
Supplier<Test> testSupplier = creatorFor(Test.class);
// this is reflection free now:
System.out.println(testSupplier.get());
System.out.println(testSupplier.get());
}

private static <T> Supplier<T> creatorFor(Class<T> type) throws Exception {
String toCreate = type.getName();
ClassPool pool = ClassPool.getDefault();
// create new class with some unique name
CtClass generatorClass = pool.makeClass("generated." + toCreate + "Creator");
// lets implement some common interface for easier usage
generatorClass.addInterface(pool.getCtClass(Supplier.class.getName()));
// and implement it method that will create new instance of our object
CtMethod generatorMethod = CtNewMethod.make(
"public Object get() { return new " + toCreate + "(); }",
generatorClass);
generatorClass.addMethod(generatorMethod);
// the only reflective part we need:
return (Supplier<T>) generatorClass.toClass().newInstance();
}
}

关于java - 我们可以使用javassist创建实例对象而不使用反射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57802435/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com