我已经使用 ASM 检测了我的类并像这样处理它
public class MyClassLoader extends ClassLoader {
...
byte[] classBytes = ... //the class is of type com.mypackage.Test
Class clazz = defineClass("com.mypackage.Test", classBytes, 0, classBytes.length);
resolveClass(clazz);
com.mypackage.Test test =(com.mypackage.Test) clazz.newInstance();
但是我在最后一行得到 ClassCastException:
java.lang.ClassCastException: com.mypackage.Test cannot be cast to com.mypackage.Test
解决方法是使用反射:
Object test = clazz.newInstance();
test.getClass().getMethods()[0].invoke(test, null); //invoke some method - successfully
我是否使用了错误的类加载器或其他东西?
最佳答案
Class.newInstance
是一个反射调用。
在这些情况下,您通常会做的就是让类加载器成为加载现有代码的类加载器的子加载器。让实现类实现代码的类加载器中的接口(interface)。使用 Class.asSubclass
使 Class
成为接口(interface)的已知子类型。通过Class.getConstructor.newInstance
构造实现类的实例。
使用此技术,您不依赖于使用反射来选择方法,尽管它确实需要无参数构造函数。
关于java - 使用字节数组中的类而不进行反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355197/