在方法前插入 return 会导致没有消息的 VerifyError
Inserting return before method causes VerifyError without message
我刚刚尝试更改方法的行为:替换 return 值:
ctMethod.insertBefore("return null;");
转换工作完美,我什至将 clazz.toBytecode()
写入文件,IntelliJ IDEA 成功反编译了 .class
文件,我可以在那里看到我的更改。
但是,有一个错误阻止了 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
。同样的事情发生在 3.27.0-GA
和 3.27.0-GA-bugfix-328
.
上
setBody
(ctMethod.setBody("return null;");
) 解决了问题:现在我返回了空值。
您自己的回答提到了另一种方法,但没有回答您的问题:
What does it mean? What am I doing wrong?
在问题的开头添加无条件的 return
语句会使方法的其余代码无法访问。如果在任何 Java class 中添加这样的语句,编译将失败并出现 "unreachable statement" 错误。可能字节码验证器也会进行这样的检查。
更新: 经过一些讨论和自己的研究,我认为可以在 Javassist 中做一些事情来解决这个问题,参见 issue #352 这是我刚刚创建的。
我刚刚尝试更改方法的行为:替换 return 值:
ctMethod.insertBefore("return null;");
转换工作完美,我什至将 clazz.toBytecode()
写入文件,IntelliJ IDEA 成功反编译了 .class
文件,我可以在那里看到我的更改。
但是,有一个错误阻止了 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
。同样的事情发生在 3.27.0-GA
和 3.27.0-GA-bugfix-328
.
setBody
(ctMethod.setBody("return null;");
) 解决了问题:现在我返回了空值。
您自己的回答提到了另一种方法,但没有回答您的问题:
What does it mean? What am I doing wrong?
在问题的开头添加无条件的 return
语句会使方法的其余代码无法访问。如果在任何 Java class 中添加这样的语句,编译将失败并出现 "unreachable statement" 错误。可能字节码验证器也会进行这样的检查。
更新: 经过一些讨论和自己的研究,我认为可以在 Javassist 中做一些事情来解决这个问题,参见 issue #352 这是我刚刚创建的。