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

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


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

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

最佳答案

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

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

10-08 11:03