有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在方法之前插入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


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    What does it mean? What am I doing wrong?

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


    更新:经过一些讨论和自己的研究,我认为可以在Javassist中做一些事情来解决这个问题,请参见我刚刚创建的issue #352