设为首页 加入收藏

TOP

实例探索Class文件(三)
2015-12-01 14:11:46 来源: 作者: 【 】 浏览:29
Tags:实例 探索 Class 文件
0008,指向8号常量池,即描述符为”I”?
attributes_count为0,即没有任何属性?


field3:?
access_flag为0x0010|0x0008|0x0002,即ACC_FINAL | ACC_STATIC | ACC_PRIVATE,标志其为private static final类型?
name_index为0x000A,指向10号常量池,即简单名称为”sfi”?
descriptor_index为0x0008,指向8号常量池,即描述符为”I”?
attributes_count为1,即有一个属性?

该属性的?
attribute_name_index为0x000B,指向11号常量池,即”ConstantValue”属性?
attribute_length为2,即固定2个字节?
constantvalue_index为0x000C,指向12号常量池,即sfi的值为”127”(这里还是字符串)?


field4:?
access_flag为0x0010|0x0008|0x0001,即ACC_FINAL | ACC_STATIC | ACC_PUBLIC,标志其为public static final类型?
name_index为0x000D,指向13号常量池,即简单名称为”sfs”?
descriptor_index为0x000E,指向14号常量池,即描述符为”Ljava/lang/String;”?
attributes_count为1,即有一个属性?

该属性的?
attribute_name_index为0x000B,指向11号常量池,即”ConstantValue”属性?
attribute_length为2,即固定2个字节?
constantvalue_index为0x000F,指向15号常量池,即sfs的值为”test strings”?


field5:?
access_flag为ACC_PRIVATE,标志其为private类型?
name_index为0x0011,指向17号常量池,即简单名称为”sb”?
descriptor_index为0x0012,指向18号常量池,即描述符为”Ljava/lang/StringBuilder;”?
attributes_count为0,即没有任何属性?


9.methods_count/methods(方法数/方法)?
方法域的method_info结构与字段域是一样的,即


不过其access_flag有些不同


?


如果一个方法是抽象方法,那么它就不能为private、static、final、synchronized、native和strict类型


方法域出现的属性有Code、Deprecated、Exceptions、Synthetic?
下面介绍新出现的两种属性Code和Exceptions:?
(1).Code?
其info域的结构如下


?


其中:


首先看exception_table_info的结构,可以预见,一个异常在代码中的描述就必须包含作用域、异常类型和异常处理三部分内容,看看exception_table_info是不是这样组织的


不出所料,start_pc就是异常处理器起始位置相对该段代码的偏移量,?
end_pc就是异常处理器结束位置相对该段代码的偏移量,?
handler_pc就是异常处理器第一条指令相对该段代码的偏移量?
catch_type指向描述该异常类型(java/lang/Throwable或其子类)的CONSTANT_Class常量池索引,二若catch_type为0,那么异常处理器将处理所有异常


(2).LineNumberTable?
行号表与ELF/PE文件看上去有着异曲同工之妙,它同样建立了方法的字节码偏移量和源代码行号之间的映射关系。其info域结构如下


?


?


?


line_number_table_length描述了行号表的项数,注意,并不是行号表各项并不是逐行对应,而是可能按照任何顺序排列,并且可能多项对应同一行。?
line_number_info的结构如下:


其中,start_pc描述了该行起始第一个字节码对应该段代码的偏移量,line_number描述了对应的行号。


(3).LocalVariableTable?
这里由LocalVariableTable保存了方法的栈帧中局部变量域源代码中局部变量的名称和描述符之间的映射关系。


?


同样,局部变量表也是以local_variable_table_length个local_variable_info结构进行组织的?


local_variable_info的结构如下:


(4).Exceptions属性?
区别于描述Code属性的exception_table部分,这里是方法可能会抛出的异常,而非包围代码的try/catch异常。Exceptions属性的info域格式如下:


?


?


?


exception_index_table是该方法抛出的异常类型的CONSTANT_Class常量池索引,number_of_exceptions指出了抛出异常类型的数量。?


methods部分的解析可以参考http://note.youdao.com/share/?id=b1c762ba1ee4874a23eb8a512cccf507&type=note?
10.attributes_count/attributes(属性数和属性)?
最后还有两种属性:InnerClass和SourceFile?
(1).SourceFile?
其info结构为:


?


?


给出了指向源文件名的CONSTANT_Utf8常量池索引?
如该class文件最后的attributes_count为1,其?
attribute_name_index为0x0033,指向51号常量池,即”SourceFile”属性?
attribute_length为0x02,即2个字节?
sourcefile_index为0x0034,指向52号常量池,即源文件名为”TestClass.java”


(2).InnerClasses


?


?


?


classses_info描述了内部类(成员嵌套类、局部嵌套类和匿名嵌套类)的信息,其结构如下:


以如下内容为例?
?
其生成的class文件如下:?

其InnerClasses属性内容为:?

其中匿名内部类Runnable的全限定名为InnerClassTest$1,由于其不是一个成员嵌套类(该类是局部嵌套类),其outer_class_info_index 为0,由于该类是一个匿名内部类,其inner_name_index为0(即简单名称为空)?
局部嵌套类NestedLocalClass的全限定名为InnerClassTest$1NestedLocalClass,由于其不是一个成员嵌套类,其outer_class_info_index为0,其简单名称为”NestedLocalClass”,access_flag为final?
成员嵌套类NestedMemberClass的全限定名为InnerClassTest$NestedMemberClass,其简单名称为”NestedMemberClass”,access_flag为public static final


此外,我们注意到内嵌类的内容会定义在各自的class文件

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java常量池解析与字符串intern简介 下一篇谈谈C#中异步编程模型的变迁

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: