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

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

3天内不再提示

JVM入门之Class结构属性表2

jf_78858299 来源:北洋洋洋 作者:北洋 2023-02-10 11:02 次阅读

LocalVariableTable,LocalVariableTypeTable

1.「LocalVariableTable」

❝用于描述局部变量表中的变量与JAVA代码中定义变量之间的关系,同样也可以选择不生成该属性

❝用处:当编写代码引用到这个方法时,参数可以直接显示变量名和类型,如果没有该属性,就用arg0,arg1代替;调试信息的时候可以根据参数变量名明确语义。

2.「LocalVariableTypeTable」

❝引入泛型后加入的属性,结构和LocalVariableTable相似,将原先用于描述字段描述符的descriptor_index替换成了描述字段的特征签名(Signature)。

❝对于非泛型变量,特征签名和描述符是一致的,但是对于泛型来说,由于泛型参数类型的擦除,描述符不能够描述泛型类型,因此定义了该属性来完成泛型的描述。

结构:图片


ConstantValue

「变量初始化,赋值时机:」 位于该属性结构中的常量将会在类加载的准备阶段就会初始化并且赋值;

其他的静态变量在这个阶段只是会被初始化然后赋默认值,如果静态变量设置了final关键字,那么就是第一种情况会对变量进行赋值;

对于实例变量(非静态变量)的赋值是在实例构造器《init》中。

「该结构中存放的字段是:」

「《Java虚拟机规范》中规定该属性结构中存放的必须是静态的字段,而对于javac编译器来说还需要满足final关键字的修饰,因此经过javac编译器编译后的该属性中存放的字段必须是static并且是final的。」

❝通知虚拟机自动为静态变量赋值(上面那句话)。该属性中只能存放基本类型和String,因为该属性的属性值

结构:图片


Deprecated及Synthetic属性

❝这两项属性有点特殊,不携带任何属性值,出现这两个属性的目的只是为了标识,这两个属性只有存在或不存在。

  1. 「Deprecated属性」 该属性用于表示某个类,字段或方法已经不再推荐使用,通过“@deprecated”注解设置这个属性

2.「Synthetic属性」

该属性用于表示字段或者方法是编译器自己添加的,不是代码中的。也可以通过设置访问标志ACC_SYNTHETIC标志位生成该项属性。

结构:两者都一样,不携带任何属性值。只是用于标识图片


StackMapTable

「该属性位于Code属性的属性表中」

❝用处:在类加载阶段的验证阶段使用该属性,代替以前耗性能的基于数据流分析的类型推导验证器(有了该属性之后就不用类型推导了,可以直接判断类型是不是符合要求,之后单独写类加载阶段进行分析)

❝之前验证阶段是基于数据流来进行分析推导出操作数栈和本地变量表操作的类型是否一致等(比如istore需要将操作数栈的数据保存到本地变量表中,但是取出的数据类型不是int就会发生问题),现在基于该项属性可以不用推导

结构:图片「一个Code属性最多只能有一个StackMapTable属性」


MethodParameters

「用于记录方法的各个形参名称和信息」

方法参数属性,位于class中的属性表中。之前说过这部分是存储在局部变量表中的,因为方法中有方法体code属性,而code中需要有局部变量表属性代表这个方法中的变量存储。

但是为什么还要单独抽出一个属性放在class中呢?

大家想想没有code就没有局部变量表,没有局部变量表是不是就不能存储方法参数了;你看接口中他有方法吧但是呢他其实没有方法提code所以它的方法参数往哪放呢?往他借口的属性表集合中放,也就是与code同级。这样的话我接口里可以直接获得方法参数通过这个属性;而对于正常的方法也就是有方法体的代码可以从code中的局部变量表中拿。

数据结构:1.首先说明他是什么,我是一个方法参数类型 2.我说明我存储的时候数据有多长(多少字节),为了切割按照这个就可以正确读取对应的数据;但是如果这个属性中还用到了其他的数据结构(属性),那么就是这个属性的个数了

3.对于没有再次用到其他属性来描述的属性直接使用定长数据即可;但是对于有用到其他属性来描述这个属性的话,则后面是对应的属性一个一个排开,然后每个属性如果是定长的话则不需要通过长度来说明所占字节,然后这个属性中存储的第一个永远是他是什么也就是名字,然后再是对应的值

不断使用这种结构来描述一个完整的class结构

结构:图片

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

    关注

    19

    文章

    2904

    浏览量

    102995
  • Class
    +关注

    关注

    0

    文章

    52

    浏览量

    19524
  • JVM
    JVM
    +关注

    关注

    0

    文章

    152

    浏览量

    12129
收藏 人收藏

    评论

    相关推荐

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

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

    JavaWeb入门响应的结构

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

    jQuery的基本选择器和class属性操作

    jQuery的基本选择器和class操作和属性操作
    发表于 05-19 13:04

    Jvm的整体结构和特点

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

    Linux快速入门文件类型及文件属性

    《嵌入式Linux应用程序开发详解》第一章 Linux 快速入门1.3.1 文件类型及文件属性1.文件类型1)普通文件2)目录文件 3)连接文件 4)设备文件2文件
    发表于 12-17 07:58

    基于节点连接结构属性值的属性图聚类匿名化方法

    社交网络中积累的海量信息构成一类图大数据,为防范隐私泄露,一般在发布此类数据时需要做匿名化处理.针对现有匿名方案难以防范同时以结构属性信息为背景知识的攻击的不足,研究一种基于节点连接结构
    发表于 12-26 11:22 0次下载
    基于节点连接<b class='flag-5'>结构</b>和<b class='flag-5'>属性</b>值的<b class='flag-5'>属性</b>图聚类匿名化方法

    Jvm工作原理学习笔记

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

    Java:JVM虚拟机的入门知识

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

    参数化Class中的静态属性

    static属性一般是在编译的时候就已经分配了内存,并被这个类的所有实例共享, 也就是在仿真时刻0之前就已经完成了静态属性的内存分配。 但是,参数化类中的静态属性可能有所区别。参数化类中的静态
    的头像 发表于 12-02 09:17 929次阅读

    JVM入门Class结构介绍1

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

    JVM入门Class结构介绍2

    本篇文章图中贴出的类型这一列也都是这两个数据类型,如果类型是u开头的表示为无符号数的数据类型,如果是_info结尾的表示是表类型。
    的头像 发表于 02-09 16:57 312次阅读
    <b class='flag-5'>JVM</b><b class='flag-5'>入门</b>之<b class='flag-5'>Class</b><b class='flag-5'>结构</b>介绍2

    JVM入门Class结构属性表1

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

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

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

    jvm内存模型和内存结构

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

    jvm参数的设置和jvm调优

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