属性表是解释 Class文件,字段表,方法表中携带的属性的表格,属性是用于描述某些场景专有的信息。

    属性名称 使用位置 含义
    Code 方法表 Java代码编译成的字节码指令
    ConstantValue 字段表 final关键字定义的常量值
    Deprecated 类,方法表,字段表 final关键字定义的常量值
    Exceptions 方法表 final方法抛出的异常
    EnclosingMethod 类文件 仅当一个类为局部类或者匿名类时才能拥有这个属性,这个属性用于标识这个类所在的外围方法
    InnerClasses 类文件 内部类列表
    LineNumberTable Code属性 Java源码的行号与字节码指令的对应关系
    LocalVariableTable Code属性 方法的局部变量描述
    StackMapTable Code属性 JDK1.6中新增的属性,供新的类型检查校验器(Type Checker)检查和处理目标方法的局部变量和操作数栈锁需要的类型是否匹配
    Signature 类,方法表,字段表 JDK1.5中新增的属性,这个属性用于支持泛型情况下的方法签名,在java语言中,任何类,接口,初始化方法或成员的泛型签名如果包含了类型变量(Type Variables)或者参数化类型(Parameterized Types),则Signature属性会为它记录泛型签名信息。由于java的泛型采用擦除法实现,在为了类型信息被擦除后导致签名混乱,需要这个属性记录泛型中的相关信息
    SourceFile 类文件 记录源文件名称
    SourceDebugExtension 类文件 JDK1.6中新增的属性,SourceDebugExtension属性用于存储额外的调试信息。譬如在进行JSP文件调试时,无法通过Java堆栈来定位到JSP文件的行号,JSR-45规范为这些非Java语言编写,却需要编译成字节码并运行在Java虚拟机中的程序提供了一个进行调试的标准机制,使用SourceDebugExtension属性就可以用于存储这个标准所新加入的调试信息
    Synthetic 类,方法表,字段表 标识方法或者字段是否为编译器自动生成的
    LocalVariableTypeTable JDK1.5中新增的属性,它使用特征签名代替描述符,是为了引入泛型语法之后能描述泛型参数化类型而添加的
    RuntimevisibleAnnotations 类,方法表,字段表 JDK1.5中新增的属性,为动态注解提供支持。RuntimevisibleAnnotations 属性用于指明哪些注解是运行时(实际上运行时就是进行反射调用)可见的
    RuntimeInvisibleAnnotations 类,方法表,字段表 JDK1.5中新增的属性,与 RuntimevisibleAnnotations 属性作用刚好相反, 用于指明哪些注解是运行时不可见的
    RuntimeVisibleParameterAnnotations 方法表 JDK1.5中新增的属性,作用与 RuntimevisibleAnnotations 属性类似,只不过作用对象为方法参数
    RuntimeInvisibleParameterAnnotations 方法表 JDK1.5中新增的属性,作用与 RuntimeInvisibleAnnotations 属性类似,只不过作用对象为方法参数
    AnnotationDetault 方法表 JDK1.5中新增的属性,用于记录注解类元素的默认值
    BootstrapMethods 类文件 JDK1.5中新增的属性,用于保存 invokedynamic 指令引用的引导方法限定符

    上述的每一个属性都需要从常量池中引用一个 CONSTANT_Utf8_info 类型常量来标示。还包含 attribute_length(u4) 用于标示属性值所占用的位数,后面再跟着属性内容

    具体类型结构可参见:
    Java字节码「随身手册」
    如何读懂晦涩的 Class 文件