gpt4 book ai didi

java - 对象不是声明类的实例

转载 作者:行者123 更新时间:2023-12-01 23:08:42 25 4
gpt4 key购买 nike

我正在使用 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 不可分配给 orinalClass,尽管名称相同。

看看 Java instrumentation API用于更改已加载的类。

关于java - 对象不是声明类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22377248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com