深入理解java虚拟机(3)---类的结构
计算机在开始的时候,只认识0和1,所以汇编语言是和机器结构或者说CPU绑定的。ARM体系结构就是这样一种体现,指令集的概念。
随着高级语言的出现,从字编码发展到了字节编码,计算机的先驱希望能够让语言能够脱离语言的环境,从而程序员只要开发代码,而无需适配设备。
java语言就是这样被创建了。java通过虚拟机这样一个中间件,由它来沟通语言和操作系统间的联系,从而使java可以跨平台使用。虚拟机的设计不
仅仅是只供java使用,而是对于其他语言,在未来,也可以提供平台无关性的体验。所以虚拟机处理的不是".java"文件,而是".class"文件。
class文件结构:
class文件结构,是一个标准的格式。对于class的文件的了解,并不是我们的目的。所以这部分只是必要的了解就可以了。

1.class结构与魔数
魔数的作用是确定文件格式是唯一判定虚拟机可以接受的文件类型。
class文件的魔数是0xCAFEBABY.
然后是版本号:5-6位是次版本号,而7-8位是主版本号。java版本是从45开始的,java1.1 能支持45.0~45.65535 而java1.7 就是51.0
其实jdk就带有分析工具javap

javap可以很好的分析class内容的结构。
所以具体如何分析class结构,本文不会介绍。
2.常量池
常量池存放2类东西,字面量和符号引用。
常亮池的入口,是u2类型的数据,代表常量池的容量的计数值。
这个设计同很多计算机中的规范类似。
字面量接近java的概念,文本字符串和final的常量。
符号引用:
类和接口的全限定名
字段名称和描述符
方法的名称和描述符
java的class不会保存各个方法,字段的最终内存布局。也就是说,当JVM运行时,需要从常量池里面获取对应的符号引用,
在类创建或者运行时解析,翻译到具体的内存地址。
常量池的每一种常量都是一个表结构。
先看一个简单的例子:
如何定义class的信息。
先看这张图,这是一个典型的类文件:

首先我们看到0x00000032,所以这个java的版本是50.0 对应的就是java1.6
后面0x16 代表的是22, 此处需注意:常量池的计数是从1开始的,也就是常量池中一共有21个常量结构。
先看第一个 0x07,对应的是:class类型。具体更多类型,可以参考 相关书籍介绍。(书籍本文后面会介绍)
简单来说,classinfo 就1个东西,class name。
图上的位置就是 0x0002,也就是指向了常量池的第二个常量。
第二个常量池的标志是0x01, 也就是字符串常量。
最终结果就是上面一节 javap分析出来的内容。
它的内容,明显就是上面看到的那串字符。“org/fenixsoft/clazz/TestClass” . 这就是class的name。
其他常量也可通过类型过程分析出来。
javap可以直接帮我们分析常量池。
3.访问标志
第一时间想到的是:public, private, protected . 还有final,static。
但是这是一个“类”的限定,所以还会有其他类型的访问标志。

目前只定义的8种。
可以看到:interface,enum,注解等东东,从编译器的角度来讲,都是差不多的。
4.类索引,父类索引 和接口索引。
一个类, 只有一个父类,并且有0~n个接口。
所以。类的索引,就是 当前类的信息,父类信息,接口信息。
这3个索引是连在一起的。
前2个表示在常量池中的位置,后面一个表示接口的个数。
5.字节码指令
早些年看《计算机组成与设计硬件/软件接口》一书的时候,非常过瘾,任何高级语言 最终的流向就是指令级,或者说CPU操作指令。
而计算机本质上只认识0 & 1,所以 简单可以理解为,java语言编译后,编程字节指令,然后经CPU处理。
所以此处就不介绍这部分内容。
深入理解java虚拟机(3)---类的结构的更多相关文章
- 深入理解Java虚拟机(类文件结构)
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...
- 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...
- 《深入理解Java虚拟机》类文件结构
上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...
- 深入理解Java虚拟机(七)——类文件结构
Java的无关性 由于计算机领域中有很多操作系统和硬件平台同时在竞争,所以,很多编程语言的程序设计会与其运行的平台和操作系统产生耦合,这样就大大增加了程序员的工作,为了适应不同的平台,需要修改很多代码 ...
- 【深入理解Java虚拟机】类的初始化过程
类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...
- 深入理解java虚拟机---java内存区域与内存溢出异常---1内存结构
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- 《深入理解 Java 虚拟机》读书笔记:类文件结构
正文 一.无关性的基石 1.两种无关性 平台无关性: Java 程序的运行不受计算机平台的限制,"一次编写,到处运行". 语言无关性: Java 虚拟机只与 Class 文件关联, ...
- 《深入理解java虚拟机》:类的初始化
深入理解java虚拟机>:类的初始化 类从被载入到虚拟机内存中開始.到卸载出内存为止,它的整个生命周期包含:载入.验证.准备.解析.初始化.使用和卸载七个阶段.当中验证.准备.解析3个部分统称为 ...
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- 深入理解java虚拟机(5)---字节码执行引擎
字节码是什么东西? 以下是百度的解释: 字节码(Byte-code)是一种包含执行程序.由一序列 op 代码/数据对组成的二进制文件.字节码是一种中间码,它比机器码更抽象. 它经常被看作是包含一个执行 ...
随机推荐
- Android学习笔记之Drawable 文件夹
PS:最近闲着无聊..模仿去写个QQapp..效果还不错..并且从中又学习到了一些相关的东西,在这里进行一些相关总结.. 学习内容: Android 中 Drawable 文件夹内部相关属性.. ...
- 哀悼我的第一次"创业"经历
下周考完最后一科,大学四年时光基本上算是落下帷幕,剩下的就只是整整毕业设计了.如果按照正常的节奏,这个学期应该能够搞完毕业设计的2/3,但无奈还在广州的一家公司里面实习,没有多少时间弄,得拖到3月了. ...
- ASP.NET 文件上传类 简单好用
调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...
- CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备
一.前言 VirtualBox默认是不能识别USB设备的,但可以通过Oracle VM VirtualBox Extension Pack来增强VirtualBox的功能,增强的功能如下: 1. US ...
- 在VS中使用TinyFox调试OWIN应用(转)
在很早一段时间之前,我曾经写过一篇关于Katana的使用方法的文章<如何安装并简单的使用OwinHost——Katana>,上面就有介绍如何在VS中调试使用Katana作为Host的App ...
- 以神经网络使用为例的Matlab和Android混合编程
由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是...) ...
- ANT自动打包U3D安卓项目研究笔记
概述 因项目使用Atlassian Stash作为项目源码管理端,且其支持Ant命令自动编译,可使其根据最新的代码自动打包,故产生该研究Ant打包的任务.在此将研究过程及一些相关知识整理记录在此. 本 ...
- 【jQuery基础学习】09 jQuery与前端(这章很水)
这章主要是将如何将jQuery应用到网站中,或者说其实就是一些前端知识,对于我这种后端程序来说其实还是蛮有用的. 关于网站结构 文件结构 前端文件分三个文件夹放 images文件夹用来存放将要用到的图 ...
- csharp:Dapper Sample
You can find Dapper on Google Code here: http://code.google.com/p/dapper-dot-net/ and the GitHub dis ...
- Python科学计算——前期准备
1.开发环境搭建 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公 ...