我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java class文件格式之数据类型(二)_动力节点Java学院整理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java class文件格式之数据类型(二)_动力节点Java学院整理

常量池中各数据项类型详解(续)

(8) CONSTANT_Class_info

常量池中的一个CONSTANT_Class_info, 可以看做是CONSTANT_Class数据类型的一个实例。 他是对类或者接口的符号引用。 它描述的可以是当前类型的信息, 也可以描述对当前类的引用, 还可以描述对其他类的引用。 也就是说, 如果访问了一个类字段, 或者调用了一个类的方法, 对这些字段或方法的符号引用, 必须包含它们所在的类型的信息, CONSTANT_Class_info就是对字段或方法符号引用中类型信息的描述。 

CONSTANT_Class_info的第一个字节是tag, 值为7, 也就是说, 当虚拟机访问到一个常量池中的数据项, 如果发现它的tag值为7, 就可以判断这是一个CONSTANT_Class_info 。 tag下面的两个字节是一个叫做name_index的索引值, 它指向一个CONSTANT_Utf8_info, 这个CONSTANT_Utf8_info中存储了CONSTANT_Class_info要描述的类型的全限定名。 

此外要说明的是, java中数组变量也是对象, 那么数组也就有相应的类型, 并且数组的类型也是使用CONSTANT_Class_info描述的, 并且数组类型和普通类型的描述有些区别。 普通类型的CONSTANT_Class_info中存储的是全限定名, 而数组类型对应的CONSTANT_Class_info中存储的是数组类型相对应的描述符字符串。 举例说明:

与Object类型对应的CONSTANT_Class_info中存储的是: java/lang/Object 

与Object[]类型对应的CONSTANT_Class_info中存储的是: [Ljava/lang/Object; 

下面看CONSTANT_Class_info的存储布局:

Java class文件格式之数据类型(二)_动力节点Java学院整理

例如, 如果在一个类中引用了System这个类, 那么就会在这个类的常量池中出现以下信息:

Java class文件格式之数据类型(二)_动力节点Java学院整理

(9) CONSTANT_Fieldref_info

常量池中的一个CONSTANT_Fieldref_info, 可以看做是CONSTANT_Field数据类型的一个实例。 该数据项表示对一个字段的符号引用, 可以是对本类中的字段的符号引用, 也可以是对其他类中的字段的符号引用, 可以是对成员变量字段的符号引用, 也可以是对静态变量的符号引用, 其中ref三个字母就是reference的简写。 之前的文章中, “符号引用”这个名词出现了很多次, 可能有的同学一直不是很明白, 等介绍完CONSTANT_Fieldref_info, 就可以很清晰的了解什么是符号引用。 下面分析CONSTANT_Fieldref_info中的内容都存放了什么信息。 

和其他类型的常量池数据项一样, 它的第一个字节也必然是tag, 它的tag值为9 。 也就是说, 当虚拟机访问到一个常量池中的一项数据, 如果发现这个数据的tag值为9, 就可以确定这个被访问的数据项是一个CONSTANT_Fieldref_info, 并且知道这个数据项表示对一个字段的符号引用。 

tag值下面的两个字节是一个叫做class_index的索引值, 它指向一个CONSTANT_Class_info数据项, 这个数据项表示被引用的字段所在的类型, 包括接口。 所以说, CONSTANT_Class_info可以作为字段符号引用的一部分。 

class_index以下的两个字节是一个叫做name_and_type_index的索引, 它指向一个CONSTANT_NameAndType_info 。 这个CONSTANT_NameAndType_info描述的是被引用的字段的名称和描述符。 我们在前面的博客中也提到过, CONSTANT_NameAndType_info可以作为字段符号引用的一部分。

到此, 我们可以说, CONSTANT_Fieldref_info就是对一个字段的符号引用, 这个符号引用包括两部分, 一部分是该字段所在的类, 另一部分是该字段的字段名和描述符。 这就是所谓的 “对字段的符号引用” 。

下面结合实际代码来说明, 代码如下:

package com.bjpowernode.test; public class TestInt {  int a = 10;  void print(){   System.out.println(a);  } } 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java class文件格式之数据类型(二)_动力节点Java学院整理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java class文件格式之数据类型(二)_动力节点Java学院整理

常量池中各数据项类型详解(续)(8) CONSTANT_Class_info常量池中的一个CONSTANT_Class_info, 可以看做是CONSTANT_Class数据类型的一个实例。 他是对类或者接口的符号引用。 它描述的可以是当前
2023-05-31

Java class文件格式之常量池_动力节点Java学院整理

常量池中各数据项类型详解常量池中的数据项是通过索引来引用的, 常量池中的各个数据项之间也会相互引用。在这11中常量池数据项类型中, 有两种比较基础, 之所以说它们基础, 是因为这两种类型的数据项会被其他类型的数据项引用。 这两种数据类型就是
2023-05-31

Java class文件格式总结_动力节点Java学院整理

我们都知道JVM能够识别的只有class格式的文件, 而源文件只是我们人能识别的, 不能被JVM识别。 那我们要在更深的层次上理解Java语言, 理解JVM, 只懂源文件是不够的, 因为虚拟机的很多的行为, 是在class文件中定义的, 而
2023-05-31

Java class文件格式之属性详解_动力节点java学院整理

Code属性code属性是方法的一个最重要的属性。 因为它里面存放的是方法的字节码指令, 除此之外还存放了和操作数栈,局部变量相关的信息。 所有不是抽象的方法, 都必须在method_info中的attributes中有一个Code属性。下
2023-05-31

深入理解Java class文件格式_动力节点Java学院整理

Class文件在Java体系结构中的位置和作用对于理解JVM和深入理解Java语言, 学习并了解class文件的格式都是必须要掌握的功课。 原因很简单, JVM不会理解我们写的Java源文件, 我们必须把Java源文件编译成class文件,
2023-05-31

Java class文件格式之特殊字符串_动力节点Java学院整理

class文件中的特殊字符串首先说明一下, 所谓的特殊字符串出现在class文件中的常量池中,本着循序渐进和减少跨度的原则, 首先把class文件中的特殊字符串做一个详细的介绍, 然后再回过头来继续讲解常量池。 现在我们将重点放在特殊字符串
2023-05-31

redis数据类型_动力节点Java学院整理

Redis支持5种数据类型,它们描述如下: Strings - 字符串Redis的字符串是字节序列。在Redis中字符串是二进制安全的,这意味着他们有一个已知的长度,是没有任何特殊字符终止决定的,所以可以存储任何东西,最大长度可达512兆。
2022-06-04

redis哈希类型_动力节点Java学院整理

redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用Dictionary存放的话,可以根据场景优先考虑下redis哦。一:常用方法只要
2022-06-04

redis集合类型_动力节点Java学院整理

我们来看看Redis五大类型中的第四大类型:“集合类型”,集合类型还是蛮有意思的,先看redis手册,如下:上面就是redis中的set类型使用到的所有方法,还是老话,常用的方法也就那么四个(CURD)。。。一: 常用方法 1. SAdd这
2022-06-04

redis列表类型_动力节点Java学院整理

据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗,因为有了它我就不需要专门的MQ产品啦,比如说RabbitMQ,ActiveMQ等等。。。
2022-06-04

Java concurrency之AtomicLongFieldUpdater原子类_动力节点Java学院整理

AtomicLongFieldUpdater介绍和函数列表AtomicLongFieldUpdater可以对指定"类的 'volatile long'类型的成员"进行原子更新。它是基于反射原理实现的。AtomicLongFieldUpdat
2023-05-31

Java concurrency之AtomicLong原子类_动力节点Java学院整理

AtomicLong介绍和函数列表AtomicLong是作用是对长整形进行原子操作。在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让l
2023-05-31

Java数据结构之队列(动力节点Java学院整理)

队列的定义:队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。 (1)允许删除的一端称为队头(Front)。(2)允许插入的一端称为队尾(Rear)。(3)当队列中没有元素时称为空队列。(4)队列亦称作先进先出
2023-05-31

redis字符串类型_动力节点Java学院整理

我们都知道redis是采用C语言开发,那么在C语言中表示string都是采用char[]数组的,然后你可能会想,那还不简单,当我执行如下命令,肯定是直接塞给char[]数组的。如果你真的这么想的话,会有几个问题就要过来砍你了,先我们来找一个
2022-06-04

struts2数据处理_动力节点Java学院整理

Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理。值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言。 值栈:ValueStack一种数据结构,操作数据的方式为:先进后出 OGNL : Object-G
2023-05-31

Java设计模式之代理模式_动力节点Java学院整理

引言Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对
2023-05-31

Java设计模式之策略模式_动力节点Java学院整理

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。类型:行为类模式类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模
2023-05-31

Java数据结构与算法之栈(动力节点Java学院整理)

stack,中文翻译为堆栈,其实指的是栈,heap,堆。这里讲的是数据结构的栈,不是内存分配里面的堆和栈。栈是先进后出的数据的结构,好比你碟子一个一个堆起来,最后放的那个是堆在最上面的。队列就是排队买苹果,先去的那个可以先买。栈public
2023-05-31

Java数据库连接池之DBCP浅析_动力节点Java学院整理

一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体
2023-05-31

Java设计模式之迭代器模式_动力节点Java学院整理

定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。类型:行为类模式类图: 如果要问Java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧:publ
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录