JVM初始化类契机
* 对于初始化只有主动使用类字段时才会初始化<br>
* 除非对一个类的主动引用,否则所有引用类的方式都不会触发其初始化<br>
* 主动引用有且只有以下场景:<p>
* 遇到new 、getstatic、putstatic或invokestatic者四条字节码指令时,如果类没有进行初始化,则需要先触发其初始化。
* 对应的JAVA代码场景是
1)new 实例对象、读取或设置一个类的静态字段[被final修饰、已在编译器把结果放入常量池的静态字段除外]时候,以及调用一个类的静态方法的时候【除外:静态字段,静态方法】
这里笔者验证了一下 发现ClassA .其中一个静态final变量 还是会触发其初始化。。。
2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则先触发其初始化
3)当初始化一个类的时候,如果发现父类还没有过初始化,则需要其先触发其父类的初始化
4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main方法的那个类)虚拟机先初始化这个主类
5)当使用jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic,REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应类没有进行过初始化,则先触发其初始化
这5中场景中的行为称为对一个类的主动引用。除此之外所有引用 类的方式都不会触发初始化,称为被动引用。
列举一下被动引用相关代码
public class SuperClass {
static {
System.out.println("SuperClass init!");
}
public static int par=123;
}
public class SubClass extends SuperClass {
public static int parv=1234;
static {
System.out.println("Subclass init!");
}
}
/**
*非主动使用类字段演示
*/
public class NotInitialization { public static void main(String[] args) {
System.out.println(SubClass.par);
} }
输出
p.p1 { margin: 0; font: 12px Menlo }
SuperClass init!
123
这里有几个关键字需要注意一下
p.p1 { margin: 0; font: 12px Menlo; color: rgba(79, 118, 203, 1) }
发起对类的主动调用 会触发其初始化 否则任何一个引用 类的方式都不会触发其初始化
JVM初始化类契机的更多相关文章
- JDK8中JVM对类的初始化探讨
在<深入理解Java虚拟机>(第二版,周志明著)中,作者介绍了JVM必须初始化类(或接口)的五种情况,但是是针对JDK7而言的. 那么,在JDK8中,这几种情况有没有变化呢?(我猜测应该会 ...
- 实例的初始化由JVM装载类的时候进行,保证了线程的安全性
在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测 ...
- JDK 8 - JVM 对类的初始化探讨
在<深入理解 Java 虚拟机>(第二版,周志明著)中,作者介绍了 JVM 必须初始化类(或接口)的五种情况,但是是针对 JDK 7 而言的. 那么,在 JDK 8 中,这几种情况有没有变 ...
- JVM加载的初始化类
首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...
- JVM 1.类的加载、连接、初始化
Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用 ...
- jvm(2)类的初始化(一)
[深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码. 1,下面说的初始化主要是类变量的初始化,实例变量的初始化触发条件不同(一 ...
- Java 类加载机制(阿里面试题)-何时初始化类
(1)阿里的面试官问我,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的字节码进 ...
- jvm(1)类的加载(二)(自定义类加载器)
[深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...
- JVM调用类的main方法的过程
jvm先装载类,再链接类,再初始化类(以代码的文本顺序执行类变量初始化器.类静态初始化方法或接口的属性(field)初始化器),完成类的初始化后,才执行类的main方法.在链接过程中,可以静态链接(解 ...
随机推荐
- 老猿学5G扫盲贴:中国移动的5G计费架构解读
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 在<老猿学5G扫盲贴:3GPP中的 ...
- Python中使用f字符串进行字符串格式化的方法
在<第3.10节 Python强大的字符串格式化新功能:使用format字符串格式化>介绍了使用format进行字符串格式化的方法,在Python 3.6中,如果格式化字符串中的关键字参数 ...
- PyQt(Python+Qt)学习随笔:QToolBox工具箱currentItem对应的index、text、name、icon、ToolTip属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在Designer中,toolBox主要有如下属性: 可以看到,toolBox的属性主要是与当前项相 ...
- 第15.30节 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint消息画出scrollAreaWidgetContents的范围矩形
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 在<PyQt(Python+Qt)学习随笔:QScrollArea滚动区域详解> ...
- 第十六章、Model/View开发:QColumnView的作用及对应Model
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在Qt Designer的Item Views(Model-based)部件中,Colum ...
- PyQt(Python+Qt)学习随笔:QTreeView树形视图的wordWrap属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeView树形视图的wordWrap属性用于控制视图展示数据项文本的单词换行原则,如果该值为 ...
- springboot:定时任务
在日常的开发过程中经常使用到定时任务,在springMVC的开发中,经常和quartz框架进行集成使用,但在springboot中没有这么做,而是使用了java的线程池来实现定时任务. 一.概述 在s ...
- 【学习笔记】最小直径生成树(MDST)
简介 无向图中某一点(可以在顶点上或边上),这个点到所有点的最短距离的最大值最小,那么这个点就是 图的绝对中心. 无向图所有生成树中,直径最小的一个,被称为 最小直径生成树. 图的绝对中心的求法 下文 ...
- 学生证申请Idea
1.地址:https://www.jetbrains.com/shop/eform/students2.英语不好的一键翻译,说明:三五天下来3.上图:
- 七牛云上传视频(后端获取tolen)
参照网址 https://developer.qiniu.com/kodo/sdk/1242/python #pip install qiniufrom qiniu import Auth #需要填写 ...