我们都知道,java是一种平台无关的语言。java代码通过java编译器(如javac等),将.java文件编译成字节码,也就是.class文件。字节码是运行在jvm虚拟机之上的。而不同的平台则 有不同的虚拟机映射规则。因此,我们从虚拟机上面一层来看,java是平台无关的。write once ,写的java程序,只要在装了jre的电脑,或者任何设备中,都可以运行,也就是run anywhere.

下面主要介绍一下从深入理解Java虚拟机中学习到的类文件结构,也就是class文件规范。

class文件,按照以下的数据项,不论是顺序还是数量甚至数据存储的字节序(大端法)都是严格规定的,哪个字节代表什么含义长度先后顺序都不能改变。u1 u2 u4 u8表示1 2 48个字节的无符号数,可以用来描述数字 索引引用,数量值或者按照UTF-8构成的字符串值。

类型 名称 数量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count - 1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attribute_count 1
attribute_info attributes attributes_count

针对上述结构,对于每个info,又有很多内容。详细参见深入java虚拟机把。。。。

接下来谈一下,Java虚拟机如何夹杂class文件,以及class文件被加载到虚拟机后又发生了什么?

java虚拟机的类加载机制:虚拟机将描述类的数据从class文件中加载到内存,然后对数据进行校验,转换解析,初始化,最终形成可以被虚拟机直接利用的java类型的过程。

java加载链接和初始化,都是在程序运行时完成的。

类的生命周期:加载--验证--准备--解析--初始化--使用--卸载。

在什么情况下会触发初始化?

1.new(创建实例指令) getstatic putstatic invokestatic(访问类字段,或者成为类变量):使用new实例化对象时,读取或者设置一个静态字段(被final修饰已在编译期把结果放入常量池的静态字段除外)以及调用静态方法时

2.使用java.lang.reflect包对类进行反射调用。如果类没有初始化,首先触发初始化。

3.初始化一个类时,如果父类还没有被初始化,那么先要触发其父类的初始化。

4.虚拟机启动时,用户需要指定一个需要执行的主类(就是main()的那个类) 虚拟机会首先初始化这个主类。

5.jdk1.7以上,动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的结果REF_getstatic,REF_putstatic,REF_invokestatic的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则必须触发初始化。

虚拟机规范中指明:有且只有 以上行为才会初始化,称为主动引用。除此之外的任何引用类的方法,都不会触发初始化,称之为被动引用。

其实根据以上五条规则,就可以知道类的加载顺序了。

转载于:https://www.cnblogs.com/CongLollipop/p/6666410.html

深入理解java虚拟机之类文件结构以及加载相关推荐

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

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

  2. Java虚拟机之装载(加载、连接、初始化)

    为什么80%的码农都做不了架构师?>>>    Class类型通常以文件的形式存在(当然,任何二进制流都可以是class类型),只有被java虚拟机装在的class类型才能在程序中使 ...

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

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

  4. 深入理解Java虚拟机(第二版) 第六章:类文件结构

    第六章 类文件结构 6.1 概述 6.2 Class类文件结构 6.2.1 魔数与Class文件版本号 6.2.2 常量池 6.2.3 访问标志 6.2.4 类索引.父类索引和接口索引集合 6.2.5 ...

  5. 深入理解Java虚拟机-第六章 类文件结构

    第六章 类文件结构 6.1 概述 略 6.2 无关性的基石 因为想要实现 "Write Once,Run Anywhere"的伟大理想,Java 虚拟机被发明了出来.这些虚拟机都可 ...

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

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

  7. mysql种编译码写在哪_深入理解Java虚拟机(程序编译与代码优化)

    对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就从虚拟机层面来看看虚拟机对我们所编写的代码采用了哪些优 ...

  8. 膜拜!阿里内部学习的五大深入理解Java虚拟机PDF,真的强

    前言 Java是目前用户最多.使用范围最广的软件开发技术,Java的技术体系主要由支撑Java程序运行的虚拟机.提供各开发领域接口支持的Java类库.Java编程语言及许许多多的第三方Java框架(如 ...

  9. 膜拜,阿里内部都在学习的五大深入理解Java虚拟机PDF,简直强无敌

    前言 Java是目前用户最多.使用范围最广的软件开发技术,Java的技术体系主要由支撑Java程序运行的虚拟机.提供各开发领域接口支持的Java类库.Java编程语言及许许多多的第三方Java框架(如 ...

最新文章

  1. 小猪学设计模式——工厂模式之抽象工厂
  2. 【Socket网络编程】3.字节序转换函数htons、htonl ,地址转换函数inet_ntoa、inet_ntop、inet_pton、inet_addr
  3. 成功解决\PyInstaller\compat.py, line 378  out = out.decode(encoding) UnicodeDecodeError: utf-8 codec c
  4. mysql varchar 1024_mysql中的数据类型
  5. php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例
  6. android替换电话应用,android – 替换调用应用程序
  7. html地图无法点击,无法触发谷歌地图标记点击事件从HTML按钮
  8. 使用ReentrantLock和Lambdas进行干净同步
  9. Close window without alert
  10. Android 控制ScrollView滚动到底部
  11. [ARC057D]全域木
  12. quartz集成到springboot_一个用来学习 spring boot 的开源项目,总共包含 57 个集成demo...
  13. 解决eclipse/myeclipse导入项目时出现红色叹号的方法
  14. Julia:和Julia相关的经济学网站 和初学者网站
  15. navicat中看sql执行计划
  16. [ZT]COMPAQ PROLIANT 8500上手动安装NetWare 4.11
  17. 数字电路设计JK触发器
  18. 看电影学英语是学习口语的最佳方式
  19. elementui级联选择器Cascader不触发change事件
  20. DDL,DQL,DML,DCL全称

热门文章

  1. [解题报告] The Collatz Sequence
  2. DBA大牛告诉你,如何让MySQL语句执行加速?
  3. 部署软件RDMA的步骤
  4. 200多位专家热议“智慧城市” 建议尽快完善标准体系
  5. 数据库设计中的范式、关联与nosql分析【转】
  6. Apache Storm 官方文档 —— 消息的可靠性保障
  7. 刚发现 emacs的新的go-mode
  8. Java http协议概述
  9. MOSS2007 实现单点登陆
  10. 区块链安全:2019年我们走了多远?