我一直在尝试使用ASM字节码工具包替换类中公共和静态方法的主体。实际的身体替换似乎可以正常工作,并且如果在转换完成后执行以下命令,则可以得到预期的行为:

Class cls = loadClass("ext.hm.cmd.MyProg");
cls.getMethod("hello").invoke(instance);


但是,如果我尝试像这样将新实例投射到MyProg

MyProg p =  (MyProg) instance;
p.hello();


我收到错误消息:
java.lang.ClassCastException:ext.hm.cmd.MyProg无法转换为ext.hm.cmd.MyProg

由于我没有在类中添加或删除任何方法,因此我无法真正理解为什么会收到此错误。有没有人看过这个,如果是这样,是什么原因造成的,我该如何解决?

谢谢
丹尼尔·马丁森

最佳答案

有点猜测,但是我想说您有一个由两个不同的ClassLoader加载的同一个命名类。实际上,它们被认为是两个单独的类,一个不能转换为另一个。

一个装在行前

 MyProg p =  (MyProg) instance;


被执行。另一个是通过调用loadClass加载的。

要解决此问题,您可能需要执行上述代码行的类由加载更改后的MyProg实例的同一ClassLoader加载。然后它应该工作。

08-05 18:15