目前我正在使用ASM库实现自定义软件度量工具。通过此库计算方法大小的唯一方法是在每次指令访问时手动增加一些大小变量,这对我来说看起来有些错误。有没有另一种常用的方法来计算方法字节码大小?还是每条指令的大小计算是否足够合理?
手动添加指令大小不适用于 ASM,因为 ASM 专注于处理指令并方便地隐藏语义相同的指令的不同形式。
例如,ALOAD_0
(一个字节(、ALOAD 0
(两个字节(和WIDE ALOAD 0
(四个字节(具有相同的含义,并通过visitVarInsn(Opcodes.ALOAD, 0)
调用报告给MethodVisitor
。那么在处理此指令时,您不必关心不同的形式,但您不知道原始类文件中存在哪一种形式。
由于 ASM 不提供直接处理 Code
属性的 API,因此它不适合此特定任务。这个答案包含一个如何使用Javassist实现这一点的示例。