`
lilisalo
  • 浏览: 1110656 次
文章分类
社区版块
存档分类
最新评论

Java动态性: 类加载时的延迟初始化

 
阅读更多

背景知识:

java类的加载过程。

相关博文:Java 类加载器( ClassLoader)浅析

java类的装载(Loading)、链接(Linking)和初始化(Initialization)


误区:值得注意的是,需要搞清楚 对符号引用的解析类的初始化的区别。

java类的装载(Loading)、链接(Linking)和初始化(Initialization)》一文中提到了, 链接的最后一步是resolution , 即对符号引用的解析,但这不是必须的,可以等到相应的符号引用第一次使用时再解析。而类的初始化是在链接之后的(注意了,根据不同JVM有不同的实现方式,在类初始化的时候,可能已经完成了所有的符号引用的解析,也可能没有),本文所写的就是 类的初始化的时机问题。


java类的动态加载机制规定,在类被主动使用(active use)之前,必须已经完成类的初始化。

既然有主动调用,那么就有被动调用了。这两者有哪些区别呢?

主动使用的情况:

1. 创造该类的一个新的实例

2.调用这个类中的静态方法

3.获取类或者接口中的非常量的静态变量

4.利用反射调用方法。

5.初始该类的某子类。

6.被制定为JVM开始运行时必须初始化的类。

注意:

首先,3中为何是“非常量的静态变量”。如果是常量,即声明为final的话,并不会出现对类的构造,虽然调用时有类名出现,但实际调用会直接使用常量,绕过了类的限制(详情见相关constant pool 和 runtime constant pool的知识)。

只有当一个非常量的静态变量被显示的在类或接口中声明时,它的调用才属于主动调用。对于父类中某非常两静态变量的调用属于被动使用(positive use),

如下代码


运行的结果是:

虽然有出现Son,但Son.i访问的是父类的非常量静态变量。于是没有对Son类进行初始化,而只是初始化了明确的声明静态变量的Parent类。

由此可见,一般的,我们在某个类中定义了其他类的成员变量引用,只要该变量没有 new 出一个新的 对象,则JVM也不会初始化这个类,类此时只是被加载了而已,而没有链接 和初始化。



分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    虚拟机类加载机制 / 171 7.1 概述 / 171 7.2 类加载的时机 / 172 7.3 类加载的过程 / 176 7.3.1 加载 / 176 7.3.2 验证 / 178 7.3.3 准备 / 181 7.3.4 解析 / 182 7.3.5 初始化 / 186 7.4 类加载器 ...

    Java虚拟机

    7.3.5 初始化 7.4 类加载器 7.4.1 类与类加载器 7.4.2 双亲委派模型 7.4.3 破坏双亲委派模型 7.5 本章小结 第8章 虚拟机字节码执行引擎 8.1 概述 8.2 运行时栈帧结构 8.2.1 局部变量表 8.2.2 操作数栈 ...

    java面试宝典

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    类什么时候才被初始化: 58 类的初始化步骤: 59 【*JVM】什么是JVM线程死锁?JVM线程死锁,你该如何判断是因为什么?如果用VisualVM,dump线程信息出来,会有哪些信息? 59 【*JVM】查看jvm虚拟机里面堆、线程的...

    jdbc基础和参考

    延迟加载:从数据库中还原对象的时候,不会立即对对象进行初始化,而是等到用到的时候才会进行初始化 Core: POJO hibernate.cfg.xml .hbm.xml Session: 1.轻量级的,创建和销毁不需要消耗很大的资源 2.非线程...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例085 域的默认初始化值 106 实例086 编写同名的方法 107 实例087 构造方法的应用 108 5.2 修饰符的使用 109 实例088 单例模式的应用 109 实例089 祖先的止痒药方 110 实例090 统计图书的销售量 111 实例091 汉诺...

    Spring面试题

    在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中读取配置信息,把它们存放到各种配置对象 当ActionServlet接收到一个客户请求时,将执行如下流程. -(1)检索和用户请求匹配的...

    千方百计笔试题大全

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    javaSE代码实例

    15.4.3 匿名内部类的初始化 337 15.4.4 匿名内部类作用的体现 337 15.5 理解内部类 339 15.6 内部接口 340 15.6.1 定义在类中的内部接口 340 15.6.2 定义在接口中的内部接口 341 15.7 小结 342 第16...

    Spring中文帮助文档

    3.3.4. 延迟初始化bean 3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. Singleton beans和prototype-bean的...

    Spring API

    3.3.4. 延迟初始化bean 3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. Singleton beans和prototype-bean的...

    jquery插件使用方法大全

    基本上Jquery的很多plugin都是利用这个特性,正因为这个特性,多个plugin共同使用起来,在初始化时不会发生冲突。 当使用jquery时,推荐使用代码1。 编辑本段事件机制  我们大量使用的事件可能就是button的onclick...

Global site tag (gtag.js) - Google Analytics