Class文件结构介绍[字段表集合和方法表集合]-阿里云开发者社区

开发者社区> 游客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虚拟机》


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

相关文章
推荐一个WINDOWS系统文件介绍的网站
http://www.cn.filename.info/文件名信息数据库: 病毒, 特洛伊人, 背后?文件名义上 _*.* (5) a*.* (129) b*.* (38) c*.
701 0
[动态代理三部曲:中] - 从动态代理,看Class文件结构定义
前言 这篇内容是上一篇[动态代理三部曲:上] - 动态代理是如何"坑掉了"我4500块钱的补充,进一步分析篇。 建议二者结合食用,醇香绵软,入口即化。 好了,不扯淡了,开始... 正文 2、Class 文件的格式 这里为啥是2开头呢?因为上篇文章是1 这部分内容不知道各位小伙伴是怎么感觉的。
1170 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12071 0
【技术贴】解决Eclipse编译java源文件之后没有生成class文件|找不到class文件
【技术贴】解决Eclipse编译java源文件之后没有生成class文件|找不到class文件   今天遇到的,非常恶心,项目下有个红叉叉,因为是公司的老项目,1.4的jdk,我把工程导入后,发现没有报错,但是有小红叉,自动保存代码编译完java源文件之后,找不到class文件。
1424 0
JVM加载class文件的原理机制
Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。
755 0
无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用
java.lang.Error: 无法解析的编译问题: 无法解析类型 javax.servlet.http.HttpServletRequest。从必需的 .class 文件间接引用了它 无法解析类型 javax.servlet.http.HttpServletResponse。
1543 0
Linux内核文件cache管理机制介绍
1 操作系统和文件Cache管理 操作系统是计算机上最为重要的软件,他负责管理计算机的各种硬件资源,并将这些物理资源抽象成各种接口供上层应用使用。所以从程序的角度看,操作系统就好比是一个虚拟机,这个虚拟机不提供各种硬件资源的具体细节,而仅仅提供进程、文件、地址空间以及进程间通信等等逻辑概念。 对于存储设备上的数据,操作系统向应用程序提供的逻辑概念就是“文件”。应用程序要存储或访问数据时
1571 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
332
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载