一、概述

在class文件中,属性表集合包括Java虚拟机预先规范定义的属性以及用户自定义的属性,对于用户自定义的属性,虚拟机加载的时候会自动忽略掉。class文件、字段表、方法表都可以携带自己的属性表集合,便于描述某些场景专有的信息。

二、组成

JVM虚拟机-Class文件之属性表集合_属性表

虚拟机中预定义的属性有:

属性名称

使用位置

含义

Code

方法表

Java代码编译成的字节码指令

ConstantValue

字段表

final关键字定义的常量池

Deprecated

类,方法,字段表

被声明为deprecated的方法和字段

 Exceptions

方法表 

方法抛出的异常 

 EnclosingMethod

类文件 

仅当一个类为局部类或者匿名类是才能拥有这个属性,这个属性用于标识这个类所在的外围方法 

 InnerClass

类文件 

内部类列表 

 LineNumberTable

Code属性 

Java源码的行号与字节码指令的对应关系 

 LocalVariableTable

Code属性 

方法的局部便狼描述 

 StackMapTable

Code属性 

JDK1.6中新增的属性,供新的类型检查检验器检查和处理目标方法的局部变量和操作数有所需要的类是否匹配 

 Signature

类,方法表,字段表 

 用于支持泛型情况下的方法签名

 SourceFile

类文件 

记录源文件名称 

 SourceDebugExtension

类文件 

用于存储额外的调试信息 

 Synthetic

类,方法表,字段表 

标志方法或字段为编译器自动生成的 

 LocalVariableTypeTable

类 

使用特征签名代替描述符,是为了引入泛型语法之后能描述泛型参数化类型而添加 

 RuntimeVisibleAnnotations

类,方法表,字段表 

为动态注解提供支持 

 RuntimeInvisibleAnnotations

表,方法表,字段表 

用于指明哪些注解是运行时不可见的 

 RuntimeVisibleParameterAnnotation

方法表 

作用与RuntimeVisibleAnnotations属性类似,只不过作用对象为方法

 RuntimeInvisibleParameterAnnotation 

 方法表

 作用与RuntimeInvisibleAnnotations属性类似,作用对象哪个为方法参数

 AnnotationDefault

 方法表

用于记录注解类元素的默认值 

 BootstrapMethods

类文件 

用于保存invokeddynamic指令引用的引导方式限定符  

属性表的结构attribute_info

attribute_info{
attribute_name_index//属性的名称索引(指向常量池)2个字节
attribute_length//属性长度 4个字节
info//有attribute_length个字节属性值
}

三、常见属性介绍

Code属性

Exceptions属性

LineNumberTable属性

LocalVariableTable属性

SourceFile属性

ConstantValue属性

InnerClass属性

属性表这部分内容比较多,也比较复杂,暂时先记录到这里。