开发者社区> 游客a74jvhcp7vclg> 正文

Class文件结构介绍[字段表集合和方法表集合]

简介: 字段表(field_info)用来描述接口或类中声明的变量,字段包括类级别变量以及实例级别变量。但不包括方法内部声明的局部变量。以如下代码来分析
+关注继续查看


字段表集合

 字段表(field_info)用来描述接口或类中声明的变量,字段包括类级别变量以及实例级别变量。但不包括方法内部声明的局部变量。以如下代码来分析

public final  class Test2 implements Serializable,Runnable{

    private static final String NAME="bobo";
    
    private int age = 18;
    
    public void fun1(){
        int b = 20;
        int c = 30;
        int d = b+c+age;
        System.out.println(d);
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        
    }
}

image.png

field_info(字段表)结构

image.png

image.png

access_flags

access_flags用来存储变量的权限修饰符,它与类中的访问标志(access_flags)非常的类似,都是一个u2类型的数据。

image.png

name_index

name_index表示field的名称(字段名)

image.png

descriptor_name

descriptor_name是field的类型描述符(字段类型描述符),作用:用来描述字段的数据类型,方法的参数列表(包括数量,类型和顺序)和返回值,

image.png

对于数组类型,每一个维度将使用一个"[“字符来描述,如二维数组 java.lang.String[][],将被记录为”[[Ljava/lang/String",int[]将被记录为"[I" 例如

private static final String NAME="bobo";
private String users[][];
private int age = 18;

image.png

字段表中包含固定数据项目到descriptor_index为止就结束了,不过在此之后跟随着一个属性表集合用于存储一些额外信息,字段都可以在属性表中描述零至多个额外信息,在上面的三个字段中name为静态常量所以属性表中有信息,如下

image.png

具体的属性表下篇文章具体介绍。

方法表集合

 方法表和字段表很相似,如果字段表弄清楚了那么方法表也很简单,先来看下classpy观察的样例结果:

public final  class Test2 {

    private static final String NAME="bobo";
    
    private String users[][];
    
    private int age = 18;
    
    public void fun1(){
        int b = 20;
        int c = 30;
        int d = b+c+age;
        System.out.println(d);
    }
}

image.png

方法表的结构

image.png

access_flags结构

image.png

name_index

方法定义的名称,注意本案例中我们只定义一个方法"fun1",但是我们发现方法表中有两个方法其中一个<init>是实例的构造器方法。

image.png

descriptor_name

方法描述符,描述方法的参数类型返回值等。描述方法规则 参数列表在前返回值在后

public final  class Test2 {

    private static final String NAME="bobo";
    
    private String users[][];
    
    private int age = 18;
    // 描述符 ()V
    public void fun1(){
        int b = 20;
        int c = 30;
        int d = b+c+age;
        System.out.println(d);
    }
    // 描述符; (I[Ljava/lang/String[[I)Z
    public boolean fun2(int name,String[] games,int[][] date){
        return true;
    }
}

image.png

参考《深入理解Java虚拟机》


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JVM虚拟机-Class文件之字段表集合
JVM虚拟机-Class文件之字段表集合
27 0
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
17 0
JVM虚拟机-Class文件之方法表集合
JVM虚拟机-Class文件之方法表集合
18 0
实现两个不同实体类的list相同属性字段互拷
实现两个不同实体类的list相同属性字段互拷
14 0
List中根据某个实体的属性去重或者排序
List中根据某个实体的属性去重或者排序
56 0
Go-映射类型详解(遍历、增删改查、判断相等、内存等)
Go-映射类型详解(遍历、增删改查、判断相等、内存等)
36 0
JVM14_Class文件结构细节、魔数、Class文件版本、常量池、访问标识(或标志)、类索引|父类索引|接口索引集合、字段|方法|属性表集合(二)
③. 如何确保高版本的JVM可执行低版本的class文件? ④. 常量池(class文件的基石) ①. 什么是常量池? ②. 常量池计数器 ③. 常量池表
57 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载