我刚刚尝试更改一个方法的行为:替换返回值:
ctMethod.insertBefore("return null;");
转换非常有效,我甚至将clazz.toBytecode()
写入一个文件,IntelliJ IDEA成功地反编译了该.class
文件,我可以在那里看到我的更改。
然而,有一个错误阻止了类的重新转换,它似乎是在我的转换器执行后抛出的,它在本地代码中,并且没有消息:
java.lang.VerifyError
at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167)
at [place where I call retransformClasses]...
这是什么意思?我做错了什么?
如果我改为使用ctMethod.insertBefore("System.out.println(1);");
,它就会开始工作。
javassist的版本是3.26.0-GA
。CCD_ 5和CCD_。
您自己的答案提到了另一种方法,但没有回答您的问题:
这是什么意思?我做错了什么?
在问题的开头添加一个无条件的return
语句会使方法的其余部分无法访问代码。如果在任何Java类中添加这样的语句,编译都将失败,并显示"不可达语句">错误。字节码验证器可能也执行这样的检查。
更新:经过一些讨论和自己的研究,我认为可以在Javassist中做一些事情来解决这个问题,请参阅我刚刚创建的问题#352。
setBody
(ctMethod.setBody("return null;");
(解决了这个问题:现在我返回了null。