总结下ASM的ClassReader和ClassWriter的Flag值

总结下ASM的ClassReader和ClassWriter的Flag值

最近在研究Asm和javaclass字节码相关的东西 但是对于ClassWriter 构造方法的flag值和ClassReader的accept方法的flag值 有些模糊和混淆 于此做个总结用以加强我的印象和分享

ClassReader

accpet方法 org.objectweb.asm.ClassReader#accept(org.objectweb.asm.ClassVisitor, int)
第二个参数是 一个flag值 可为 中随意搭配和组合
  • ClassReader.EXPAND_FRAMES
  • ClassReader.SKIP_DEBUG
  • ClassReader.SKIP_CODE
  • ClassReader.SKIP_FRAMES
ClassReader.EXPAND_FRAMES
展开 StackMapTable 属性
ClassReader.SKIP_DEBUG
跳过类文件中的调试信息,比如行号(LineNumberTable)等
ClassReader.SKIP_CODE
跳过方法体中的code属性 (方法字节码,异常表等等)
ClassReader.SKIP_FRAMES
跳过 StackMapTable 属性

ClassWriter

构造方法 
org.objectweb.asm.ClassWriter#ClassWriter(org.objectweb.asm.ClassReader, int)
第二个参数是 一个flag值 可为 中随意搭配和组合
  • ClassWriter.COMPUTE_MAXS
    
  • ClassWriter.COMPUTE_FRAMES
    
0:
这种方式不会自动计算操作数栈和局部变量表的大小,需要我们自己来手动指定
ClassWriter.COMPUTE_MAXS
这种方式会自动计算上述 操作数栈和局部变量表的大小 但需要手动触发
通过调用org.objectweb.asm.commons.LocalVariablesSorter#visitMaxs
触发 参数可以随便写
ClassWriter.COMPUTE_FRAMES
不仅会计算上述 操作数栈和局部变量表的大小 还会自动计算StackMapFrames

以上是我目前在2020.07.01 对 asm 的理解

你可能感兴趣的:(资料整理,asm,ASM,Java字节码,bytecode)