3.4 解析属性表

和常量池类似,各种属性表达的信息也各不相同
不同之处在于,常量是由Java虚拟机规范严格定义的,共有14种。

但属性是可以扩展的,不同的虚拟机实现可以定义自己的属性类型,因此无法用统一的结构来定义。由于这个原因,Java虚拟机规范没有使用tag,而是使用属性名来区别不同的属性。属性数据放在属性名之后的u1表中,这样Java虚拟机实现就可以跳过自己无法识别的属性。

属性的结构定义如下:

attribute_info {

  u2 attribute_name_index;//属性名 常量池索引,指向常量池中的CONSTANT_Utf8_info
  u4 attribute_length;//长度

  u1 info[attribute_length];
}

Java虚拟机规范预定义了23种属性:



规范预定义属性

这个ClassFileTest.class为例

package jvmgo.book.ch03;

public class ClassFileTest {

    //常量池里面的类型都是 CONSTANT_Integer_info
    public static final boolean FLAG = true;
    public static final byte BYTE = 123;
    public static final char X = 'X';
    public static final short SHORT = 12345;
    public static final int INT = 123456789;

    public static final long LONG = 12345678901L;
    public static final float PI = 3.14f;
    public static final double E = 2.71828;
    
    public static void main(String[] args) throws RuntimeException {
        System.out.println("Hello, World!");
    }
    
}

Deprecated和Synthetic属性(本例没有)

Deprecated和Synthetic是最简单的两种属性,仅起标记作用,不包含任何数据。这两种属性都是JDK1.1引入的,可以出现在ClassFile、field_info和method_info结构中,它们的结构定义如下:

Deprecated_attribute {
  u2 attribute_name_index;
  u4 attribute_length;//0
}
Synthetic_attribute {
  u2 attribute_name_index;
  u4 attribute_length;//0
}

由于不包含任何数据,所以attribute_length的值必须是0。

Deprecated属性用于指出类、接口、字段或方法已经不建议使用,编译器等工具可以根据Deprecated属性输出警告信息。

Synthetic属性用来标记源文件中不存在、由编译器生成的类成员,引入Synthetic属性主要是为了支持嵌套类和嵌套接口。

SourceFile属性(ClassFile属性 一级目录最下面)

可选定长属性,只会出现在ClassFile结构中,用于指出源文件名。

SourceFile_attribute {
  u2 attribute_name_index;
  u4 attribute_length;//必须2
  u2 sourcefile_index;//常量池索引,指向CONSTANT_Utf8_info常量
}
就一个class属性

ConstantValue属性(static field常量的值)

ConstantValue是定长属性,只会出现在field_info结构中,
用于表示常量表达式的值(详见Java语言规范的15.28节)。

ConstantValue_attribute {
  u2 attribute_name_index;
  u4 attribute_length;//2
  u2 constantvalue_index;//常量池索引
}

attribute_length的值必须是2。constantvalue_index是常量池索引

具体指向哪种常量因字段类型而异。


byte BYTE = 123;

最小数字是int

Code属性(method属性)

变长属性,只存在于method_info结构中,存放字节码等方法相关信息

Code_attribute {

  u2 attribute_name_index;
  u4 attribute_length;

  u2 max_stack;//操作数栈的最大深度
  u2 max_locals;//出局部变量表大小

  //字节码
  u4 code_length;
  u1 code[code_length];

  //异常处理表
  u2 exception_table_length;
  {
    u2 start_pc;
    u2 end_pc;
    u2 handler_pc;
    u2 catch_type;
  }  exception_table[exception_table_length];

  //属性表
  u2 attributes_count;
  attribute_info attributes[attributes_count];
}
main方法

Exceptions属性(method属性,方法有写着抛异常就有)

变长属性,记录方法抛出的异常

Exceptions_attribute {

  u2 attribute_name_index;
  u4 attribute_length;//长度

  u2 number_of_exceptions;//个数
  u2 exception_index_table[number_of_exceptions];
}
public static void main(String[] args) throws RuntimeException

LineNumberTable LocalVariableTable(Code属性的属性)

method属性的Code属性的属性

LineNumberTable 方法的行号
LocalVariableTable 方法的局部变量

和前面介绍的SourceFile属性都属于调试信息,都不是运行时必需的。在使用javac编译器编译Java程序时,默认会在class文件中生成这些信息。可以使用javac提供的-g:none选项来关闭这些信息的生成

LineNumberTable_attribute {

  u2 attribute_name_index;
  u4 attribute_length;

  u2 line_number_table_length;
  { 
    u2 start_pc;
    u2 line_number;
  }  line_number_table[line_number_table_length];
}
main方法的codes属性的第一个属性LineNumberTable

main方法的codes属性的第2个属性LocalVariableTable
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 类文件结构 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式— 字节码( ByteCode ) 是构成平台无...
    好好学习Sun阅读 530评论 0 0
  • 1. Class文件数据类型 根据Java虚拟机规范规定,Class文件格式采用一种类似于C语言结构体的伪结构来...
    HRocky阅读 245评论 0 0
  • 定义 作用域是指程序源代码中定义变量的区域。分为全局作用域和局部作用域。一个函数就是一个作用域。作用域规定了如何查...
    倾国倾城的小饼干阅读 269评论 0 0
  • 米蓝七月学而思D10 <不抱怨的世界>2 BY静怡 抱怨与健康 听静怡的带读及她分享与女儿一起成长的故事,就很好给...
    童润Mama阅读 151评论 0 0
  • "又做梦了?" "嗯,又做梦了。" "还是那个梦?" "嗯,还是那个梦" "还是...
    一大口鸡汤阅读 8,532评论 1 2