Java ClassCast异常在I';我们使用ASM工具包来替换静态方法的主体

Java ClassCast异常在I';我们使用ASM工具包来替换静态方法的主体,java,bytecode,Java,Bytecode,我一直在尝试使用ASM字节码工具包来替换类中的公共静态方法体。实际的车身更换似乎工作正常,如果在转换完成后执行以下操作,我会获得预期的行为: Class cls = loadClass("ext.hm.cmd.MyProg"); cls.getMethod("hello").invoke(instance); 但是,如果我尝试像这样将新实例强制转换为MyProg MyProg p = (MyProg) instance; p.hello(); 我收到错误消息: java.lang.Clas

我一直在尝试使用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

由于我没有在类中添加或删除任何方法,所以我无法真正理解为什么会出现此错误。以前有人见过这种情况吗?如果有,原因是什么?我该如何解决

谢谢

丹尼尔·马丁森(Daniel Martinsson)

有点猜测,但我要说的是,您有两个不同的类加载器加载了相同的命名类。这些实际上被视为两个独立的类,一个不能转换为另一个

一个在生产线前装载

 MyProg p =  (MyProg) instance;
被执行。另一个是通过调用
loadClass
加载的


要解决这个问题,您可能需要执行上述代码行的类由加载修改后的MyProg实例的类加载器加载。然后它应该可以在不同的类实例上工作。

+1。但是,要解决这个问题,最好转换原始类,即在第一次加载类之前进行转换。谢谢各位,我很欣赏你们的输入。我不确定在第一次加载类时是否可以进行转换,因为我只需要(并且可以访问)在应用程序的其他部分中,该类仍可以在其原始状态下使用时,该类位于一个位置。这个加载器层次结构必须向上走多远?我可以使用通常加载的classA来加载MyProgProvider吗?自定义ClassLoader使用相同的自定义ClassLoader实例来加载MyProg?@Daniel:最简单的方法是让两个版本的类都扩展/实现一个接口或超级类型MyProgSuper,并且只处理该接口或超级类型。