Java ASM 4.1常量池中的visitLdcInsn非法类型
我正在使用ASM4.1。我知道visitldcinn方法需要49版或更高版本,但是我想知道如何让visitldcinn与49版或更低版本一起工作。我知道解决方案是让人们使用更高版本进行编译,但我不认为这是向人们建议的合适解决方案。以下是一些测试代码,当我尝试插入时,会出现异常:Java ASM 4.1常量池中的visitLdcInsn非法类型,java,bytecode,cobertura,java-bytecode-asm,Java,Bytecode,Cobertura,Java Bytecode Asm,我正在使用ASM4.1。我知道visitldcinn方法需要49版或更高版本,但是我想知道如何让visitldcinn与49版或更低版本一起工作。我知道解决方案是让人们使用更高版本进行编译,但我不认为这是向人们建议的合适解决方案。以下是一些测试代码,当我尝试插入时,会出现异常: package mypackage; public class JDK4TEST { public static void main(String[] args) { } } 我得到以下例外情况: 线程“m
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代码的一部分。visitLdcInsn方法从一开始就存在,但一些可接受的参数类型取决于类格式版本,例如,
类型
和句柄
值对于类格式51.0及更高版本是可接受的。看
还要注意的是,ASM的
ClassWriter
不会检查生成的字节码的有效性。您需要在ClassWriter
之前添加到访客链中,谢谢!CheckClassAdapter类帮助我进一步调试异常的确切来源。问题的根本原因是我向visitLdcInsn传递的类类型与以前的版本不兼容。