我已经使用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
我使用的是错误的类加载器吗?
答案 0 :(得分:5)
Class.newInstance
是一个反思性的电话。
通常,在这些情况下您要做的是让类加载器成为加载现有代码的类加载器的子代。让实现类从代码的类加载器实现一个接口。使用Class.asSubclass
以使Class
是您界面的已知子类型。通过Class.getConstructor.newInstance
构建实现类的实例。
使用这种技术,你不依赖于使用反射来挑选方法,尽管它确实需要一个无参数的构造函数。