总结下ASM的ClassReader和ClassWriter的Flag值

    技术2022-07-10  154

    总结下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_FRAMESClassReader.SKIP_DEBUGClassReader.SKIP_CODEClassReader.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 的理解

    Processed: 0.192, SQL: 9