Object不是声明类的实例

时间:2014-03-13 11:30:22

标签: java reflection java-bytecode-asm

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

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));

1 个答案:

答案 0 :(得分:3)

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

  1. 该类型的完全限定名称。
  2. 用于加载此类型的ClassLoader
  3. 这意味着类型[com.example.Foo, ClassLoaderA][com.example.Foo, ClassLoaderB]不相等。因此,您不能将第一种类型转换为第二种类型。创建实例后,您无法更改其类型。

    该行

    originalClass.cast(originalObj)
    

    没有任何效果,因为originalObj已经是originalClass的实例。但是,复制的类c不能分配给orginalClass,尽管名称相同。

    查看Java instrumentation API以更改已加载的类。