目前,我正在使用 ASM library 。通过此库计算方法大小的唯一方法是 manually increment 每次指导访问时都会出现一些大小变量,这在我看来有些错误。有没有另一种常用的方法来计算方法字节码大小?或者每个指令的大小计算是否足够合理?
手动添加指令大小不适用于ASM,因为ASM专注于处理指令,并方便地隐藏不同形式的语义相同的指令。
例如 ALOAD_0 (一个字节), ALOADÂ Â 0 (两个字节),以及 WIDE ALOADÂ Â 0 (四个字节)具有相同的含义,并报告给 MethodVisitor 通过a visitVarInsn(Opcodes.ALOAD, 0) 呼叫然后,在处理此指令时,您不必关心不同的表单,但您不知道原始类文件中存在哪一个表单。
ALOAD_0
ALOADÂ Â 0
WIDE ALOADÂ Â 0
MethodVisitor
visitVarInsn(Opcodes.ALOAD, 0)
因为ASM不提供API来直接处理 Code 属性,它不适合此特定任务。 This answer 包含如何使用Javassist实现这一点的示例。
Code