首页 > 解决方案 > ClassNode 上的 Java ASM CheckClassAdapter

问题描述

ASM CheckClassAdapter 对于在验证错误的情况下获取有关类失败原因的有用日志输出非常有用,但是它不能用于堆栈图帧无效的情况。CheckClassAdapter 不能用于这些情况,因为它接受 ClassReader,这意味着要使用它来检查转换后的 ClassNode,我必须执行以下操作:

ClassWriter verifyWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
classNode.accept(verifyWriter);
CheckClassAdapter.verify(new ClassReader(verifyWriter.toByteArray()), true, printDumpLogFile);

当 ClassWriter 由于我的 ClassNode 的字节码异常无效而失败时,传递到 CheckClassAdapter 的输出是无效的,并且格式非常错误,带有许多空帧和 NOP。有没有办法将 ClassNode 传递给 CheckClassAdapter,避免使用限制其有用性的 ClassWriter?

标签: javajava-bytecode-asm

解决方案


如果你有办法获取输入类的字节码而不是 a ClassNode,你可以使用这样的东西:

CheckClassAdapter.verify(
  bytes,
  true,
  new PrintWriter(System.out)
);

例如,如果字节码已经存储在类文件中,您可以这样做:

CheckClassAdapter.verify(
  new ClassReader(new FileInputStream(args[0])),
  true,
  new PrintWriter(System.out)
);

但实际上,如果堆栈图帧无效,则CheckClassAdapter可能不会报告任何内容。至少我有它没有的类文件。顺便说一句,这同样适用于org.apache.bcel.verifier.Verifier。尽管如此,JVM 还是会抛出一个VerifyError,即将类加载到实际的 JVM 中是最终的检查。


推荐阅读