Den*_*hev 0 java reflection classloader
我已经使用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();
Run Code Online (Sandbox Code Playgroud)
但是我在最后一行得到ClassCastException:
java.lang.ClassCastException: com.mypackage.Test cannot be cast to com.mypackage.Test
Run Code Online (Sandbox Code Playgroud)
解决方法是使用反射:
Object test = clazz.newInstance();
test.getClass().getMethods()[0].invoke(test, null); //invoke some method - successfully
Run Code Online (Sandbox Code Playgroud)
我使用错误的类加载器还是什么?
Class.newInstance 是一个反思的电话.
通常,在这些情况下您要做的是让类加载器成为加载现有代码的类加载器的子代.让实现类从代码的类加载器实现一个接口.使用Class.asSubclass这Class是您的界面的已知子类型.通过构造实现类的实例Class.getConstructor.newInstance.
使用这种技术,您不依赖于使用反射来挑选方法,尽管它确实需要一个无参数构造函数.