class文件中的fields_count和fields

fields_count描述的是当前的类中定义的字段的个数,注意,这里包括静态字段, 但不包括从父类继承的字段。如果当前class文件是由一个接口生成的, 那么这里的fields_count描述的是接口中定义的字段, 我们知道,接口中定义的字段默认都是静态的。此外要说明的是,编译器可能会自动生成字段,也就是说, class文件中的字段的数量可能多于源文件中定义的字段的数量。举例来说,编译器会为内部类增加一个字段, 这个字段是指向外围类的对象的引用。
位于fields_count下面的数据叫做fields, 可以把它看做一个数组, 数组中的每一项是一个field_info 。这个数组中一共有fields_count个field_info , 每个field_info都是对一个字段的描述。 下面我们详细讲解field_info的结构。 每个field_info的结构如下:
(1)access_flags
其中access_flags占两个字节, 描述的是字段的访问标志信息。 这里就不在详细介绍了, 下面给出一张表格(该表格来自《深入Java虚拟机》):
(2)name_index
access_flags下面的两个字节是name_index, 这是一个指向常量池的索引, 它描述的是当前字段的字段名。 这个索引指向常量池中的一个CONSTANT_Utf8_info数据项。 这个CONSTANT_Utf8_info数据项中存放的字符串就是当前字段的字段名。
(3)descriptor_index
name_index下面的两个字节叫做descriptor_index , 它同样是一个指向常量池的索引, 它描述的是当前字段的描述符。 这个索引指向常量池中的一个CONSTANT_Utf8_info数据项。 这个CONSTANT_Utf8_info数据项中存放的字符串就是当前字段的描述符。
(4)attributes_count和attributes
descriptor_index 下面是attributes_count和attributes 。 这是对当前字段所具有的属性的描述。 这里的属性和源文件中的属性不是同一个概念, 在源文件测层面中, 属性是字段的另一种叫法, 希望读者不要疑惑。读者也不要轻视class文件中的属性, 这些属性可以描述很多的信息。 我们会在后面的文章中进行介绍。
attributes_count表示这个字段有几个属性。attributes 可以看成一个数组, 数组中的每一项都是一个attribute_info,每个attribute_info 表示一个属性, 数组中一共有attributes_count个属性。可以出现在filed_info中的属性有三种,分别是ConstantValue, Deprecated, 和 Synthetic。 这些属性会在后面的文章中进行介绍。
下面我们以代码的形式进行解释,源码如下:
package com.bjpowernode.test;
public class Programer extends Person{
private Computer computer;
public Programer(Computer computer){
this.computer = computer;
}
public void doWork(){
computer.calculate();
}
}
反编译之后, 常量池中会有如下信息(这里省略了大部分无关信息):
Constant pool:
.........
.........
#5 = Utf8 computer
#6 = Utf8 Lcom/jg/zhang/Computer;
.........
.........
{
private com.jg.zhang.Computer computer;
flags: ACC_PRIVATE
.........
.........
}
从反编译的结果可以看出,源文件中定义了一个Computer类型的字段computer,并且是private的。然后常量池中有这个字段的字段名和描述符。 其中常量池第五项的CONSTANT_Utf8_info是字段名,第六项的CONSTANT_Utf8_info是该字段的描述符。这里有一点需要说明,在反编译Programer.class时,由于computer是私有的, 要加- private选项,否则的话,虽然常量池中有字段引用信息, 但是不会输出字段信息, 即下面这两行不会输出:
private com.bjpowernode.test.Computer computer; flags: ACC_PRIVATE
如果在javap中加入 - private选项, 那么就会有上面两行的输出。 使用的命令如下:
javap -c -v -private - classpath . com.bjpowernode.test.Programer
根据反编译的结果,可以下面给出示意图, 该图说明了与computer相对应的field_info是不合引用常量池的 ( 其中虚线范围内表示常量池):
class文件中的methods_count和methods
fields下面的信息是methods_count和methods 。 methods_count描述的是当前的类中定义的方法的个数, 注意, 这里包括静态方法, 但不包括从父类继承的方法。 如果当前class文件是由一个接口生成的, 那么这里的methods_count描述的是接口中定义的抽象方法的数量, 我们知道, 接口中定义的方法默认都是公有的。此外需要说明的是, 编译器可能会在编译时向class文件增加额外的方法, 也就是说, class文件中的方法的数量可能多于源文件中由用户定义的方法。 举例来说: 如果当前类没有定义构造方法, 那么编译器会增加一个无参数的构造函数<init>; 如果当前类或接口中定义了静态变量, 并且使用初始化表达式为其赋值, 或者定义了static静态代码块, 那么编译器在编译的时候会默认增加一个静态初始化方法<clinit>。
位于methods_count下面的数据叫做methods,可以把它看做一个数组, 数组中的每一项是一个method_info。这个数组中一共有methods_count个method_info,每个method_info 都是对一个方法的描述。 下面我们详细讲解method_info的结构。每个method_info 的结构如下,几乎和field_info的结构是一样的:
(1)access_flags
其中access_flags占两个字节, 描述的是方法的访问标志信息。 这里就不在详细介绍了, 下面给出一张表格(该表格来自《深入Java虚拟机》):
(2)name_index
access_flags下面的两个字节是name_index, 这是一个指向常量池的索引, 它描述的是当前方法的方法名。 这个索引指向常量池中的一个CONSTANT_Utf8_info数据项。 这个CONSTANT_Utf8_info数据项中存放的字符串就是当前方法的方法名。
(3)descriptor_index
name_index下面的两个字节叫做descriptor_index , 它同样是一个指向常量池的索引, 它描述的是当前方法的描述符。 这个索引指向常量池中的一个CONSTANT_Utf8_info数据项。 这个CONSTANT_Utf8_info数据项中存放的字符串就是当前方法的描述符。
(4)attributes_count和attributes
descriptor_index 下面是attributes_count和attributes 。 这是对当前方法所具有的属性的描述。 这里的属性和源文件中的属性不是同一个概念, 在源文件测层面中, 属性是字段的另一种叫法, 希望读者不要疑惑。读者也不要轻视class文件中的属性, 这些属性可以描述很多的信息。 我们会在后面的文章中进行介绍。
attributes_count表示这个字段有几个属性。attributes 可以看成一个数组, 数组中的每一项都是一个attribute_info , 每个attribute_info 表示一个属性, 数组中一共有attributes_count个属性。可以出现在method_info 中的属性有三种, 分别是Code, Deprecated, Exceptions 和Synthetic。 在这几个属性中,尤其是Code和Exceptions 非常重要, 这两个属性对于在class文件中完整描述一个方法起着至关重要的作用,其中Code属性中存放方法的字节面指令,Exceptions 属性是对方法声明中抛出的异常的描述。这两属性以及其他一些属性,会在下一篇文章中详细介绍,敬请关注。
介绍完了每个method_info的结构, 下面我们以代码来说明, 还是使用上面的源码:
package com.jg.zhang;
public class Programer extends Person{
private Computer computer;
public Programer(Computer computer){
this.computer = computer;
}
public void doWork(){
computer.calculate();
}
}
反编译之后, 常量池中会有如下信息(这里省略了大部分无关信息):
Constant pool:
.........
#7 = Utf8 <init>
#8 = Utf8 (Lcom/jg/zhang/Computer;)V
.........
#12 = Utf8 ()V
.........
#19 = Utf8 doWork
{
.........
public com.jg.zhang.Programer(com.jg.zhang.Computer);
flags: ACC_PUBLIC
.........
public void doWork();
flags: ACC_PUBLIC
.........
}
由反编译结果可以看出, 该类中定义了两个方法, 其中一个是构造方法, 一个是doWork方法, 且这两个方法都是public的。 这两个方法的描述信息都存放在常量池。 其中第7项的CONSTANT_Utf8_info为构造方法的方法名, 第8项的CONSTANT_Utf8_info为构造方法的方法描述符, 第19项的CONSTANT_Utf8_info为doWork方法的方法名, 第12项的CONSTANT_Utf8_info为doWork方法的方法描述符。
根据常量池中的信息, 可以得出如下的示意图, 该示意图形象的说明了class文件中的method_info是如何引用常量池中的数据项来描述当前类中定义的方法的。 图中虚线范围内表示常量池所在的区域:
总结
到此为止, 我们就介绍完了class文件中的fields和methods, 进行一下总结。
fields是对当前类中定义的字段的描述, 其中每个字段使用一个field_info表示, fields中有fields_count个field_info。
methods是对当前类或者接口中声明的方法的描述, 其中每个方法使用一个method_info表示, methods中有methods_count个method_info。
在下一篇博客中,将会介绍class文件中的各个属性,敬请关注。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Java
# class
# 文件格式
# 浅谈JVM之java class文件的密码本
# Java class文件格式之数据类型(二)_动力节点Java学院整理
# Java class文件格式之属性_动力节点Java学院整理
# Java class文件格式之常量池_动力节点Java学院整理
# Java class文件格式之访问标志信息_动力节点Java学院整理
# java虚拟机原理:Class字节码二进制文件分析
# 的是
# 都是
# 池中
# 组中
# 是一个
# 会在
# 反编译
# 类中
# 这两个
# 每一项
# 详细介绍
# 这是
# 字段名
# 会有
# 是由
# 出现在
# 中有
# 举例来说
# 把它
# 这是一个
相关文章:
如何在阿里云ECS服务器部署织梦CMS网站?
广德云建站网站建设方案与建站流程优化指南
小建面朝正北,A点实际方位是否存在偏差?
Swift开发中switch语句值绑定模式
一键网站制作软件,义乌购一件代发流程?
香港服务器租用每月最低只需15元?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
建站VPS配置与SEO优化指南:关键词排名提升策略
魔方云NAT建站如何实现端口转发?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
广州建站公司哪家好?十大优质服务商推荐
如何快速查询域名建站关键信息?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何基于云服务器快速搭建个人网站?
网站微信制作软件,如何制作微信链接?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
如何通过多用户协作模板快速搭建高效企业网站?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
网站按钮制作软件,如何实现网页中按钮的自动点击?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
香港服务器选型指南:免备案配置与高效建站方案解析
图册素材网站设计制作软件,图册的导出方式有几种?
建站VPS推荐:2025年高性能服务器配置指南
攀枝花网站建设,攀枝花营业执照网上怎么年审?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
如何通过建站之星自助学习解决操作问题?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
深圳网站制作的公司有哪些,dido官方网站?
北京专业网站制作设计师招聘,北京白云观官方网站?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何挑选优质建站一级代理提升网站排名?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
如何获取PHP WAP自助建站系统源码?
如何规划企业建站流程的关键步骤?
如何制作网站标识牌,动态网站如何制作(教程)?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何在Windows 2008云服务器安全搭建网站?
利用JavaScript实现拖拽改变元素大小
如何使用Golang安装API文档生成工具_快速生成接口文档
建站之星免费版是否永久可用?
建站主机SSH密钥生成步骤及常见问题解答?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
高端建站三要素:定制模板、企业官网与响应式设计优化
建站主机与服务器功能差异如何区分?
如何快速搭建高效香港服务器网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
油猴 教程,油猴搜脚本为什么会网页无法显示?
*请认真填写需求信息,我们会在24小时内与您取得联系。