微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在方法之前插入return导致VerifyError而不显示消息

如何解决在方法之前插入return导致VerifyError而不显示消息

我刚刚尝试更改方法的行为:替换返回值:

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。在3.27.0-GA3.27.0-GA-bugfix-328上也是如此。

解决方法

您自己的答案提到了另一种方法,但没有回答您的问题:

是什么意思?我在做什么错了?

在问题的开头添加无条件的return语句会使方法的其余部分无法访问。如果在任何Java类中添加这样的语句,编译将因“ unreachable statement” 错误而失败。字节码验证程序可能还会执行这种检查。


更新:经过一些讨论和自己的研究,我认为可以使用Javassist来解决此问题,请参阅我刚刚创建的issue #352

,

setBodyctMethod.setBody("return null;");)解决了这个问题:现在我返回了空值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。