千家信息网

Class文件结构之如何使用字段表与方法表

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,本篇内容主要讲解"Class文件结构之如何使用字段表与方法表",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Class文件结构之如何使用字段表与方法表"吧!
千家信息网最后更新 2025年01月21日Class文件结构之如何使用字段表与方法表

本篇内容主要讲解"Class文件结构之如何使用字段表与方法表",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Class文件结构之如何使用字段表与方法表"吧!

1、字段表

字段表紧随在接口表索引之后,字段表包含访问标记、字段名索引、描述符索引、属性表,其中属性表包含属性计数器与属性集合

以这段代码为例:

package com.yang.testField;  public class Main {     private volatile int a = 1;     public static final String b = "abc";  }

16进制数据如下图所示:


可以看得出,字段计数为0x0002,因为有2个字段,a和b。

字段a的访问标记是是0x0042,用这个值与标识符的特征值取与,如果结果为1,则表示该字段拥有相应的标识符。字段标识符如下所示:


这里我们可以得出,a的访问标记有ACC_PRIVATE与ACC_VOLATILE。

a的名称索引为0x0005,我们看一下常量池:


可以得出第一个字段的名称索引指向常量池中第5个常量项,即"a"。

a的描述符索引为0x0006,即常量池中的"I",完成的字段类型与描述符的对照表如下:


接下来是a的属性计数器,对应的值为0x0000,代表a没有属性表。

贴一下b字段表中的属性表:


b的属性计数器为0x0001,代表着有属性表,属性表中只有一个元素,为0x0009,常量池中显示为ConstantValue,说明

该属性是ConstantValue类型的,属性长度为2,属性值索引为0x000A,即找到常量池中的#11,再找到#21,原来是个字符串"abc"。

为什么int a没有属性表,而static final b却有属性表?这要从字段的赋值策略说起:

对于一个实例字段,比如这里的a,赋值阶段发生在对象实例的构造方法中,即;

对于一个非final的静态字段,赋初始值会发生在解析阶段,而赋用户指定的值,会发生在初始化阶段,在类构造器方法中完成,即。

对于一个final的静态字段,且是基本类型或者是String类型,在编译期间就给该变量赋予用户指定的值,并在常量池中形成一个ConstantValue类型的属性,属性值就是常量的值。如果是除去String类型以外的引用类型,那么就是在初始化阶段完成赋值操作。

下面以一个例子说明:

package com.yang.testField;  public class Main {     private volatile int a = 1;     public static final String b = "abc";     public static String c="def";     public static Thread d=new Thread();  }

方法内的情况:


这里面完成的是对实例变量的赋值操作。

方法内的情况:


这里面完成的是对普通静态变量c与非String的引用类型变量d的赋值操作。

更多关于对与方法的理解,可以参考这篇文章java执行顺序之深入理解clinit和init

2、方法表

紧接着字段表的是方法表,方法表和字段表类似,方法表包含方法计数、访问标记、名称索引、描述符索引、属性表,其中属性表也是包含属性计数与属性集合。

方法计数、名称索引这边就不再说明了。

方法的访问标记有:


这里有一个简单的例子:

package com.yang.testMethod;  public class Main {     public Main() {     }      private int getInt(int k) {         return k;     }      public static Thread getThread(int i, double d, Runnable runnable) {         System.out.println(i * d);         return new Thread(runnable);     }  }

构造方法的描述符为()V

getInt方法的描述符为(I)I

getThread方法的描述符为(IDLjava/lang/Runnable;)Ljava/lang/Thread;

从这里,我们可以看得出,方法描述符的组织方式是这样子的:(参数列表内字段的描述符)返回值的描述符

接下来讨论方法的属性表,前面说过了,属性表包含属性计数与属性集合,属性集合又包含属性名称索引+属性长度+属性值。

属性表内最主要的属性就是Code属性了,Code属性内有几个比较重要的东西:字节码、LineNumberTable行号表、LocalVariableTable局部变量表、ExceptionTable异常表

用一下的代码为例:

public static Thread getThread(int i, double d, Runnable runnable) {     try {         System.out.println(i * d);     }catch (Exception e){         return null;     }     return new Thread(runnable); }

字节码是class文件中最重要的东西了,jvm主要就是抽取字节码,然后去执行。


LineNumberTable内维护着java源码与字节码之间的对应关系:


LocalVariableTable内记录着局部变量描述:


关于局部变量表的详细内容,可以参考我的另外一篇文章虚拟机栈的五脏六腑 。

ExceptionTable会告诉虚拟机异常的处理逻辑,比如下图的异常表,说明如果字节码从第0行到第10行出现了type类型的异常,那么将会跳转到第13行的字节码进行处理。


到此,相信大家对"Class文件结构之如何使用字段表与方法表"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

属性 字段 方法 索引 类型 常量 变量 字节 名称 标记 文件 就是 阶段 结构 内容 实例 局部 标识 标识符 计数器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 计算机网络安全课心得 数据库说明文档应该包括函数么 下一代网络安全体系的结构 天津定制软件开发怎么样 计算机网络技术一定要数学好吗 提示服务器密码更改登录不了邮箱 北京物流软件开发中心 软件开发需要专利费吗 会计和软件开发 淮安网络营销软件开发费用是多少 腾讯云服务器搭建个人网站的内容 ctf网络安全大赛游戏 服务器客户端通讯协议 什么是软件开发服务品质保障 江苏教育网络安全课题 自学数据库开发 潍坊市公安局网络安全保卫 58同城的网络安全员王鑫 守护网络安全构建和谐校园六年级 为什么软件开发都找外包公司 济南微信软件开发服务费 关于网络安全的服务 3d游戏软件开发培训学校哪家好 工程网络技术规划规程 服务器管理软件登录 办公软件开发优势 远程办公服务器哪家好 企业内部服务器有哪些 软件开发立项文档pdf下载 智联网络技术公司成都
0