使用字节数组中没有反射的类?

时间:2010-12-04 18:49:26

标签: 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();

但是我在最后一行得到了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

我使用的是错误的类加载器吗?

1 个答案:

答案 0 :(得分:5)

Class.newInstance是一个反思性的电话。

通常,在这些情况下您要做的是让类加载器成为加载现有代码的类加载器的子代。让实现类从代码的类加载器实现一个接口。使用Class.asSubclass以使Class是您界面的已知子类型。通过Class.getConstructor.newInstance构建实现类的实例。

使用这种技术,你不依赖于使用反射来挑选方法,尽管它确实需要一个无参数的构造函数。