jvm虚拟机-3 class文件字段表集合分析

5 篇文章 0 订阅
1 篇文章 0 订阅

1.字段表集合

        class文件顺序是:魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引和接口索引集合,字段表集合。

  紧接着接口索引集合的就是字段表的集合了.

  字段表(field_info)用于描述接口或者类中声明的变量.字段包括类级变量以及实例级变量,但是不包括在方法内部声明的局部变量.

       字段包括类级变量以及实例级变量。可以包括的信息有:

  • 字段的作用域(public,private,protected修饰符)
  • 实例变量还是类变量(static修饰符)
  • 可变性(final)
  • 并发可见性(volatile)
  • 可否被序列化(transient)
  • 字段数据类型(基本类型,对象,数组)
  • 字段名称

字段表的结构:

类型    名称数量
u2access_flags1
u2name_index1
u2descriptor_index1
u2attributes_count1
attribute_infoattributesattributes_count

字段修饰符放在access_flags项目中,它与类中的access_flags项目是非常相似的,都是一个u2的数据类型.

字段访问标志:

标志名称标志值含义
ACC_PUBLIC0x00 01字段是否为public
ACC_PRIVATE0x00 02字段是否为private
ACC_PROTECTED0x00 04字段是否为protected
ACC_STATIC0x00 08字段是否为static
ACC_FINAL0x00 10字段是否为final
ACC_VOLATILE0x00 40字段是否为volatile
ACC_TRANSTENT0x00 80字段是否为transient
ACC_SYNCHETIC0x10 00字段是否为由编译器自动产生
ACC_ENUM0x40 00字段是否为enum

跟随access_flags标志的是两项索引值:name_index和descriptor_index,它们都是对常量池的引用,分别代表着字段的简单名称以及字段方法和方法的描述符.

  描述符的作用是用来描述字段的数据类型,方法的参数列表(包括数量,类型以及顺序)和返回值.根据描述符规则,基本数据类型以及代表无返回值的void类型都用一个大写字符来表示,而对象类型则用字符加L加对象名的全限定名来表示.

  描述符标志含义:

标志符含义
B基本数据类型byte
C基本数据类型char
D基本数据类型double
F基本数据类型float
I基本数据类型int
J基本数据类型long
S基本数据类型short
Z基本数据类型boolean
V基本数据类型void
L对象类型

  对于数组类型,每一维度将使用一个前置的"["字符来描述.如一个定义为"java.lang.Stirng[ ]"类型的二维数组,将被记录为:"[[Ljava/lang/Stirng",一个整型数组"int[]"将被记录为"[I".

  用描述符来描述方法时,按照先参数列表,后返回值的顺序来描述,参数列表按照参数的严格顺序放在一组小括号"()"之内.

  字段表集合中不会列出从父类或者父接口中继承而来的字段,但有可能列出原来Java代码中不存在的字段,譬如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的字段.另外,在Java语言中字段是无法重载的,两个字段的数据类型,修饰符不管是否相同,都必须使用不一样的名称,但是对于字节码来讲,如果连个字段的描述符不一致,那字段重名就是合法的.

1.1字段字节码分析

javap分析常亮池得出:

文件分析:

分析:

从上图中分析可以看到0x00 01表示字段表数据的个数,只有一个.0x00 01表示字段表的public修饰符,从上面的字段访问标志表可以看到.0x00 05表示字段对应着第5个常量池,从javap分析出来的常量池,可以看到第5个常量池对应着m,再看源代码我们定义的字段确实就是m.0x00 06表示描述符标识,对应着第6个常量池,为I,那么在对应我们的访问标识符含义表,I 对应着int数据类型,再看源代码m的数据类型确实就是int.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值