0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JVM入门之Class结构介绍2

jf_78858299 来源:北洋洋洋 作者:北洋 2023-02-09 16:57 次阅读

access_flags访问标识

常量池结束后就是这个Class对应的访问标志内容,用u2(两个字节)来表示。

❝访问标志可以有多个,根据多个标志位的或运算来决定最终的access_flags的取值

class的继承实现关系

访问标志之后的是this_class,super_class,interfaces_count,interfaces这些数据。1.this_class:该Class的权限定名。( 「通过访问常量池中的类信息表来定位到类的权限定名」2.super_class:父类的全限定名。(由于Java中是 「单继承多实现」 的,所以父类索引只有一个,但是接口可以有多个稍后将),跟上面的寻找过程类似,只不过换了一个常量池的索引,「如果没有显示使用继承的话那么最终引用的是Object类的权限定名,如果明确使用了继承自哪个类那么最终引用到的就是那个类的权限定名」3.interfaces和interfaces_count 刚刚说了Class是可以多实现的,所以

interfaces_count为 「该Class实现接口的数量」 (如果没有任何实现的接口,那么该值为0后面的interfaces将没有数据不占用任何字节);

interfaces为实现接口的对应接口的全限定名

字段表

「该表结构用于描述接口/类中声明的变量」

变量可以分为类变量(static级别的),实例变量。

❝注意:该部分不包括方法中的局部变量字段,局部变量会有一个单独的局部变量表来存储,下一篇文章讲解。对于Class文件中最外层的字段表中存储的只是类变量和实例变量。

而字段有哪些数据需要表示呢?权限修饰符,字段名称,字段数据类型,类级别还是实例级别(是否有static修饰符),可变性(final),并发可见性(volatile修饰符,强制从主内存读写),是否可以被序列化(transient修饰符)

access_flags访问标识

这个访问标识和前面讲的类的access_flags不一样,这个是字段的访问标识

名称索引和描述符的索引

这两个索引都是在常量池中的索引,对常量池的引用

name_index为 「字段的名称」 descriptor_index为描述符,对应于字段来说是该**「字段的数据类型」**

描述符的含义:

❝对于一维数组来说使用“[”来表示,如果是二位就用两个“[[”。比如类型为String的二维数组(String[][])用描述符来表示就是[[ java.lang.String;一维数组“int[]”就是[I

存储额外信息

可以看到描述符后面还有一个属性表集合,该集合是用来**「存储一些额外的信息,可以添加0到多个信息。」**

如果没有额外描述的信息attributes_count就是0,后面没有字节去描述属性表;如果有额外的信息比如将字段声明为final的话,属性表中就会存储一个ConstantValue的属性,这个值指向对应的常量值。(关于这部分内容之后进行详解)

❝该字段表中不会记录父类中或者父接口中继承来的字段,但是有可能出现原本不存在的字段,比如在内部类中添加字段来访问外部类。

❝重载字段:对于Class文件来说刚刚看了,只要描述符不一致,字段名一样也是可以被记录到Class中的而不会引起冲突;但是对于Java语言来说字段是不能重载的,不管描述符一样不一样,「名称必须不一样!!!」

方法表

「该表结构用于描述接口/类中声明的变量」

「图例:」

可以看到和上面讲的字段表结构大致是一样的。

access_flags访问标识

名称索引和描述符的索引

这两个索引都是在常量池中的索引,对常量池的引用

name_index为 「方法的名称」 descriptor_index为描述符,对应于方法来说是该 「方法的参数集合和返回值类型」 对应的数据在上面讲字段表的时候已经贴过图,不在说明。

存储额外信息

这个里面的属性表中就会有各种各样的表来存储一个方法的额外信息,比如方法体中的代码,局部变量表等等表结构数据类型。(下一篇文章进行详解)

❝和字段表一样如果父类方法没有被子类重写,那么该表中不会记录父类方法的信息的,但是同样可以出现一些编译器添加的方法,比如类构造器clvinit()和实例构造器init()

❝重载方法:名称一样,方法的特征签名不一样。对于Class文件来说方法的特征签名不同(描述符不完全一致)就可以进行重载不会发生冲突;但是对于Java语言来说方法的特征签名中不包括返回值这个条件所以返回值不同不能作为重载的条件 Java代码层面的方法特征签名,Java代码的方法特征签名只包括方法名称、参数顺序及参数类型,而字节码Class的特征签名还包括方法返回值以及受查异常表,请读者根据上下文语境注意区分。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2953

    浏览量

    104496
  • C语言
    +关注

    关注

    180

    文章

    7596

    浏览量

    135955
  • Class
    +关注

    关注

    0

    文章

    53

    浏览量

    19701
  • JVM
    JVM
    +关注

    关注

    0

    文章

    157

    浏览量

    12197
收藏 人收藏

    评论

    相关推荐

    jvm的类加载器的整体结构及过程解析

    前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢。 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优、垃圾回收机制等等的问题我们
    的头像 发表于 09-27 15:49 3371次阅读
    <b class='flag-5'>jvm</b>的类加载器的整体<b class='flag-5'>结构</b>及过程解析

    Proteus基础入门教程 Proteus界面功能介绍及常用操作

    Proteus基础入门教程 Proteus界面功能介绍及常用操作
    发表于 09-27 22:35

    JavaWeb入门响应的结构

    JavaWeb入门—响应的结构
    发表于 05-15 06:00

    Jvm的整体结构和特点

    的整体结构大致如下:    1、类加载器  类加载器用来加载Java类到JVM虚拟机中,源代码程序.java文件在经过编译器编译之后就被转换成字节代码.class文件,类加载器负责读取字节代码,并转
    发表于 01-05 17:23

    Jvm工作原理学习笔记

    [] args)函数的class都可以作为JVM实例运行的起点 b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护
    发表于 04-03 11:03 5次下载

    Java:JVM虚拟机的入门知识

    Java开发现在面试越来越难了,进大厂必备的JVM、多线程高并发这都是最基础的知识了,今天我们一起来学习Java虚拟机入门
    的头像 发表于 07-01 11:43 2283次阅读
    Java:<b class='flag-5'>JVM</b>虚拟机的<b class='flag-5'>入门</b>知识

    JVM入门Class结构介绍1

    ❝根据《JAVA虚拟机规范》的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中(Class文件格式中)只有
    的头像 发表于 02-09 16:57 574次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>入门</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>结构</b><b class='flag-5'>介绍</b>1

    JVM入门Class结构属性表1

    ❝属性表在《JAVA虚拟机规范》中并没有像其他数据一样做严格的限制,我们甚至可以自己实现一个编译器往Class结构的属性表中注入额外的属性信息,虚拟机运行时会忽略掉它识别不了的属性。
    的头像 发表于 02-10 11:02 537次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>入门</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>结构</b>属性表1

    JVM入门Class结构属性表2

    ❝属性表在《JAVA虚拟机规范》中并没有像其他数据一样做严格的限制,我们甚至可以自己实现一个编译器往Class结构的属性表中注入额外的属性信息,虚拟机运行时会忽略掉它识别不了的属性。
    的头像 发表于 02-10 11:02 530次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>入门</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>结构</b>属性表<b class='flag-5'>2</b>

    USB Class介绍

    电子发烧友网站提供《USB Class介绍.pdf》资料免费下载
    发表于 08-01 16:19 0次下载
    USB <b class='flag-5'>Class</b>的<b class='flag-5'>介绍</b>

    垃圾收集器的JVM参数配置

    本篇文章我们就来给大家介绍垃圾收集器的 JVM 参数配置。 JVM参数有很多,其实我们直接使用默认的JVM参数,不去修改都可以满足大多数情况。但是如果你想在有限的硬件资源下,部署的系统
    的头像 发表于 10-09 16:35 518次阅读
    垃圾收集器的<b class='flag-5'>JVM</b>参数配置

    jvm内存溢出该如何定位解决

    超出限制和堆空间不足。 定位JVM内存溢出问题是一个比较复杂的任务,需要结合工具和技术来进行分析和解决。本文将介绍一些常用的调试和解决内存溢出问题的工具和技术。 一、理解JVM内存结构
    的头像 发表于 12-05 11:05 1275次阅读

    jvm内存模型和内存结构

    JVM(Java虚拟机)是Java程序的运行平台,它负责将Java程序转换成机器码并在计算机上执行。在JVM中,内存模型和内存结构是两个重要的概念,本文将详细介绍它们。 一、
    的头像 发表于 12-05 11:08 881次阅读

    jvm调优参数

    和类元数据等方面的参数设置。下面我们将详细介绍这些参数以及如何进行优化。 首先,堆内存是JVM中用于存放对象实例的内存区域。通过调整堆内存的大小,我们可以控制应用程序对内存资源的使用。JVM的堆内存包括新生代和老年代两部分。新生
    的头像 发表于 12-05 11:29 586次阅读

    jvm参数的设置和jvm调优

    JVM(Java虚拟机)参数的设置和调优对于提高Java应用程序的性能和稳定性非常重要。在本文中,我们将详细介绍JVM参数的设置和调优方法。 一、JVM参数的设置 内存参数: -Xms
    的头像 发表于 12-05 11:36 1378次阅读