一、平台无关性:

Java的无关性的实现,是由Java源代码编译后生成的字节码class文件和Java虚拟机实现的。无关性包括:平台无关性以及语言无关性。

(1)平台无关性,是指java代码可以运行在不同操作系统的虚拟机上面,因为不同的操作系统都有各自的Java虚拟机,从而实现程序的“一次编写,到处运行”。

(2)语言无关性是指Java虚拟机能运行除Java以外的代码,JVM执行的是class文件,也就是JVM只认识class文件,它并不关心Class文件的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。

 

二、类文件结构:

class文件是Java虚拟机执行引擎的数据入口,是一组以8位字节为基础单位的二进制流,存储的内容几乎都是程序运行的必要数据。

class文件的数据存储结构中只有两种数据类型:无符号数和表。class文件中的数据项,都被严格限定的,每个字节代表的含义,长度,先后顺序等都不允许改变。

(1)无符号数属于基本数据类型,以u1、u2、u4、u8来分别代表1、2、4、8个字节的无符号数。

(2)表是由多个无符号数或其他表作为数据项构成的复合数据类型。

class类文件的结构:

1. 魔数

2. 文件版本信息

3. 常量池

4. 访问标志

5. 类索引、父类索引、接口索引集合

6. 字段表集合

7. 方法表集合

8. 属性表集合

1、魔数:

每个Class文件的头4个字节称为魔数(magic),它的唯一作用是判断该文件是否为一个能被虚拟机接受的Class文件。它的值固定为0xCAFEBABE。

2、文件版本信息:

紧接着magic的4个字节存储的是Class文件的次版本号和主版本号,高版本的JDK能向下兼容低版本的Class文件,但不能运行更高版本的Class文件,即使该版本没有用到高版本JDK的特性。

3、常量池:

紧接着版本号之后的就是常量池入口,它是class文件中的资源仓库。它是Class文件中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一。常量池中主要存放两大类常量:字面量和符号引用。

字面量比较接近于Java层面的常量概念,如文本字符串、被声明为final的常量值等。

而符号引用总结起来则包括了下面三类常量:

(1)类和接口的全限定名

(2)字段的名称和描述符

(3)方法的名称和描述符

4、访问标志:

在常量池结束之后,紧接着的2个字节代表访问标志(access_flag),这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是类还是接口,是否定义为public类型,abstract类型,如果是类的话,是否声明为final,等。

5、类索引、父类索引、接口索引集合:

Class文件中由这三项数据来确定这个类的继承关系。类索引、父类索引和接口索引集合都按照顺序排列在访问标志之后。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。接口索引集合就用来描述这个类实现了哪些接口。

6、字段表集合:

字段表(field_info)用于描述接口或类中声明的变量。字段包括了类级变量或实例级变量,但不包括在方法内声明的变量。可以包括的信息有:字段的作用域、是实例变量还是类变量、可变性、并发可见性、可否被序列化、字段数据类型、字段名称。但是,字段的名字、数据类型、修饰符等都是无法固定的,只能引用常量池中的常量来描述。

字段表集合中不会列出从父类或接口中继承而来的字段,但有可能列出原本Java代码中不存在的字段。比如在内部类中为了保持对外部类的访问性,会自动添加指向外部类实例的字段。

7、方法表集合:

方法表(method_info)的结构与字段表的结构相同。方法里的Java代码,经过编译器编译成字节码指令后,存放在方法属性表集合中一个名为“Code”的属性里。

与字段表集合相对应,如果父类方法在子类中没有被覆写,方法表集合中就不会出现来自父类的方法信息。但同样,有可能会出现由编译器自动添加的方法,最典型的便是类构造器“<clinit>”方法和实例构造器“<init>”方法。

重载一个方法需要有相同的简单名称和不同的特征签名。JVM的特征签名和Java的特征签名有所不同:

(1)Java特征签名:方法参数在常量池中的字段符号引用的集合

(2)JVM特征签名:方法参数+返回值

8、属性表集合:

属性表(attribute_info),在Class文件、字段表、方法表中都可以携带自己的属性表集合,以用于描述某些场景专有的信息。

(1)Code属性:

Java程序方法体中的代码讲过Javac编译后,生成的字节码指令便会存储在Code属性中,但并非所有的方法表都必须存在这个属性,比如接口或抽象类中的方法就不存在Code属性。

Code属性是Class文件中最重要的一个属性,如果把一个Java程序中的信息分为代码和元数据两部分,那么在整个Class文件里,Code属性用于描述代码,所有的其他数据项目都用于描述元数据。

(2)Exception属性:

这里的Exception属性的作用是列举出方法中可能抛出的受查异常,也就是方法描述时在throws关键字后面列举的异常。

(3)LineNumberTable属性:

它用于描述Java源码行号与字节码行号之间的对应关系。

(4)LocalVariableTable属性:

它用于描述栈帧中局部变量表中的变量与Java源码中定义的变量之间的对应关系。

(5)SourceFile属性:

它用于记录生成这个Class文件的源码文件名称。

(6)ConstantValue属性:

ConstantValue属性的作用是通知虚拟机自动为静态变量赋值,只有被static修饰的变量才可以使用这项属性。

在Java中,对非static类型的变量(也就是实例变量)的赋值是在实例构造器<init>方法中进行的;而对于类变量(static变量),则有两种方式可以选择:在类构造其中赋值,或使用ConstantValue属性赋值。

如果同时使用final和static修饰一个变量(即全局常量),并且这个变量的数据类型是基本类型或String的话,就生成ConstantValue属性来进行初始化,如果该变量没有被final修饰,或者并非基本类型及字符串,则选择在<clinit>方法中进行初始化。

(7)InnerClasses属性:

该属性用于记录内部类与宿主类之间的关联。如果一个类中定义了内部类,那么编译器将会为它及它所包含的内部类生成InnerClasses属性。

(8)Deprecated属性:

Deprecated该属性用于表示某个类、字段和方法,已经被程序作者定为不再推荐使用,它可以通过在代码中使用@Deprecated注释进行设置。

(9)Synthetic属性:

该属性代表此字段或方法并不是Java源代码直接生成的,而是由编译器自行添加的,如this字段和实例构造器、类构造器等。

Java虚拟机:class类文件结构相关推荐

  1. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  2. 深入理解Java虚拟机(类文件结构)

    欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_PRIVATE.各种字节码指令等等许多概 ...

  3. JAVA类加载对字节码的处理_深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)...

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 周志明的< ...

  4. 《深入理解Java虚拟机》——类文件结构之魔数常量池

    相对于Java虚拟机的其他部分,这部分的内容我们只需要搞清楚下面两个方面的内容: 1.无关性 2.Class文件的结构与组成 我们都知道Java有个特性是:一次编写,到处运行.这里体现的是平台无关性, ...

  5. 深入java虚拟机 class类文件结构

    平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...

  6. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  7. java虚拟机class存在哪_Java虚拟机 - Class类文件结构

    平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...

  8. java 虚拟机内存类_java 虚拟机类加载 及内存结构

    在面试java工程师的时候,这道题经常被问到,故需特别注意. 1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从"Hello World &q ...

  9. Java虚拟机中 类的加载过程

    Java中 类的加载过程 例如下面的一段简单的代码 public class HelloWorld {public static void main(String[] args) {System.ou ...

  10. Java的Class类文件结构及基本字节码指令

    Class类文件的结构 概念:Class文件是一组以8位字节为基础单位的二进制流 按顺序整齐排列 没有任何分隔符,内容全部是运行时的必要数据,没有空隙存在 排序方式:高位在前 Big-Endian:最 ...

最新文章

  1. Python安装教程分享
  2. Controller 如果能保持单例,尽量使用单例
  3. 200801一阶段1函数封装
  4. LiveVideoStackCon 2019北京 Day One精彩瞬间
  5. LIS 的 n*log 算法 ———二分维护
  6. LeetCode 2. Add Two Numbers
  7. 虚拟化Hadoop集群的部署和管理 - 基本操作
  8. 利用Future异步获取多线程的返回结果
  9. 惠普企业:自今年10月起,固件 bug 将导致某些 SSD 不可用
  10. 桥接模式+C#发送邮件+配置文件
  11. Zemax学习笔记——序列模式点光源与平行光设置
  12. python大侠个人信息查询_个人信息查询,教你怎么调查一个人的资料
  13. int[]是什么类型?
  14. 如何在浏览器 console 控制台中播放视频?
  15. ERP专业知识讲座:7.财务管理
  16. 单招计算机面试技巧和注意事项,单招面试技巧和注意事项
  17. [Web]焦点图实现 篇一
  18. python 消息 推送服务器,从客户端发送字符串消息到服务器Python
  19. FreeBSD安装调试
  20. SeniorUI0402_LinearGradient线性渐变:霓虹灯文字

热门文章

  1. pch在c语言中占内存字节数,c语言期末测试题(附答案)
  2. 网页拉起QQ进行交谈
  3. Jetpack Compose学习笔记
  4. 华为诺亚开源贝叶斯优化库:超参数调优河伯、组合优化器CompBO
  5. 今日arXiv精选 | 12篇EMNLP 2021最新论文
  6. 如何高效准备2021届秋招算法岗面试?
  7. 复旦大学邱锡鹏教授:词法、句法分析研究进展综述
  8. python 曲线拟合_Python实现数学模型(插值、拟合和微分方程)
  9. python画图颜色表示大小变化_python画图(线条颜色、大小、类型:点、虚线等)(图文详细入门教程四)...
  10. 【多线程高并发】查看Java代码对应的汇编指令教程