对象不是声明类的实例



我正在使用ASM的ClassWriter复制一个类。我使用反射来加载具有此重复字节码的类,但是当我试图调用具有重复类的实例的重复类的方法时,我得到一个'对象不是声明类的实例'异常。

Object originalObj = ...
Class<?> originalClass = obj.getClass();
String methodName = ...
ClassReader cr = new ClassReader(originalClass.getName());
ClassWriter cw = new ClassWriter(0);
cr.accept(cw, 0);
DynamicClassLoader loader = new DynamicClassLoader();
Class<?> c = loader.define(originalClass.getName(), cw.toByteArray());
Method m = c.getMethod(methodName); // Assume 'methodName' has no args
m.setAccessible(true);
m.invoke(originalClass.cast(originalObj));

加载的 Java类型由两个参数组成:

  1. 类型的完全限定名。
  2. 用于加载该类型的ClassLoader

这意味着[com.example.Foo, ClassLoaderA][com.example.Foo, ClassLoaderB]类型不相等。因此,不能将第一种类型强制转换为第二种类型。实例一旦创建,就不能更改它的类型。

originalClass.cast(originalObj)

没有任何作用,因为originalObj已经是originalClass的一个实例。然而,复制的类c不能赋值给orginalClass,尽管名称相同。

看一下Java插装API,用于更改已经加载的类。

相关内容

  • 没有找到相关文章

最新更新