ASM 4.1 visitLdcInsn常量池中的非法类型

时间:2013-06-13 07:33:30

标签: java bytecode cobertura java-bytecode-asm

我正在使用ASM 4.1。我知道方法visitLdcInsn需要49或更高版本,但我想知道如何让visitLdcInsn与49及更低版本一起使用。我知道一个解决方案是让人们使用更高版本进行编译,但我不认为这是向人们建议的正确解决方案。这是一些测试代码,当我尝试仪器时,我得到了异常:

package mypackage;
 public class JDK4TEST {
  public static void main(String[] args) {
  }
 }

我收到以下异常: 线程“main”中的异常java.lang.VerifyError :(类:mypackage / JDK4TEST,方法:__ cobertura_classmap签名:(Lnet / sourceforge / cobertura / coveragedata / LightClassmapListener;)V)常量池中的非法类型

如果需要更多代码,这是github上的cobertura 2.0代码的一部分。

1 个答案:

答案 0 :(得分:2)

visitLdcInsn方法从一开始就存在,但是一些接受的参数类型取决于类格式版本,例如:类格式51.0及更高版本可接受TypeHandle值。请参阅corresponding JavaDoc

另请注意,ASM的ClassWriter并未检查生成的字节码的有效性。您需要在ClassWriter之前将CheckClassAdapter添加到访问者链中。