我正在使用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代码的一部分
visitLdcInsn
方法从一开始就存在,但一些可接受的参数类型取决于类格式版本,例如Type
和Handle
值对于类格式51.0及更高版本是可接受的。参见相应的JavaDoc。
还要注意,ASM的ClassWriter
不检查生成的字节码的有效性。您需要在ClassWriter
之前将CheckClassAdapter添加到访问者链中。