java - 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?
解决方案
如果你有办法获取输入类的字节码而不是 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 中是最终的检查。
推荐阅读
- javascript - 使用 .parent() 和 .closest() 单击/更改时的 JQuery 基本文本替换
- html - 使用 background-image:url 与图像标签居中的图像
- java - 使用 JSoup 上的“发布”请求登录并从网站检索数据
- conemu - 在“创建新控制台”对话框中更改“新进程的启动目录”的默认值
- vue.js - 如何使用带有 vue highcharts 的热图?
- objective-c - 目标 c - for 循环按顺序从 iCloud 获取图像
- c# - 如何使用在 razor 中填充的选择来修复我的搜索
- json - 如何使用 JSON 返回数字和换行符
- python - 如何在 Gekko 中获取目标函数的值
- docker - 运行 docker-compose 时丢失音量