`
凸囧凸
  • 浏览: 686 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ClassLoader 装载 链接 初始化的细节研究

阅读更多
 ClassLoader中三个阶段:装载 , 链接 , 初始化 
装载即找到对应的.class文件加载进去jvm
链接的时候有三个步骤:验证,准备,解析三个小步骤 验证是为了确保这个.class文件在结构来说是符合java语言的语法结构的。准备阶段的时候,会为该.class文件的静态资源分配存储空间,并为起赋予默认值。 最后阶段是解析 是将所有的符号引用转换为真实的引用,在这一步是会对该.class文件引用的外部文件做加载操作的。一般的classloader 并不会执行这一步 调用的一般是loadClass(String,false)而不是load(String,true) 这样只有到真正用到该引用的时候才会去做其他外部.class文件的加载工作。
以上两段红字可以通过以下两段代码来进行验证:
 
下面这段代码中 我们讲TestClone的.class文件删除了,然后执行下面这段代码
 
public class TestRelationShip {
     
     private static TestClone test = new TestClone(1);
     
     
     public void print(){
           System. out.println( "i can run");
     }
     
     public static void main(String[] args) {
           System. out.println( "main run");
     }
}
 
执行结果是报错:由此可见 若存在static关键字 则在链接的准备阶段时 jvm回去查找TestClone的.class文件(这种情况在如果某个方法的参数为TestClone的引用的时候也会出现,可见这阶段已经在解析.class文件中的方法了,我是这么认为的)
 
下面我们去掉static关键字再看一下
 
public class TestRelationShip {
     
     private TestClone test = new TestClone(1);
     
     
     public void print(){
           System. out.println( "i can run");
     }
     
     public static void main(String[] args) {
           System. out.println( "main run");
     }
}
 
执行结果通过: 由此可见 若不存在关键字 则在链接的准备价阶段 jvm并未去查找TestClone.class文件 事实上 jvm把这一步骤放到了解析的步骤中 但是classLoader一般都处在懒加载的状态 并不会去执行解析的步骤 所以main方法就成功执行了
 
最后即是初始化的过程 这个过程会去为所有属性赋予定义的值(注意:这里是你代码中给定义的值 不是jvm的默认值),并执行静态初始化块。
需要强调的是 初始化的过程并不是都走的 只有在一下几种条件下才会触发:
1.new 实例化对象
2.调用这个.class文件中的静态方法;
3.调用.class文件中的静态属性(这个属性不被final关键字修饰)
4.为静态属性赋值
5.在顶层java类中执行assert语句?(这个是抄来的。。不大理解。。)
可以这样理解:不管怎么折腾,你无法访问到一个没定义的值,jvm总会先你一步查看是否已经初始化,是否有初始化的必要(有的时候访问的是final和static修饰的属性,并且这个属性已经在链接阶段就赋上值了,这个时候就没必要初始化),如果有必要jvm就会初始化为你赋上值(当然了,如果你初始化的时候还是没有值那就只能取到链接的准备阶段时候,jvm为它附上的默认值了 (0,0.0 ,null))
分享到:
评论

相关推荐

    Java虚拟机装载和初始化一个class类代码解析

    Java 虚拟机装载和初始化一个 Class 类代码解析 Java 虚拟机装载和初始化一个 Class 类是 Java 应用程序开发中的一个关键步骤。只有被 Java 虚拟机装载的 Class 类型才能在程序中使用。下面,我们来详细解析 Java ...

    java ClassLoader机制及其在OSGi中的应用

    ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解ClassLoader的工作原理对于优化Java应用程序性能以及解决类冲突等问题具有重要意义。 一、ClassLoader的基本概念 Java程序由多个类组成,...

    深入java虚拟机加载初始化

    在深入了解Java虚拟机(JVM)的加载初始化之前,我们先明确一下`Classloader`的角色。简单地说,`Classloader`的主要职责是将编译后的`.class`文件装载到机器的内存中,为后续程序的执行提供必要的条件。这一过程...

    Java虚拟机类装载.doc

    Java虚拟机类装载的过程可以分为三个步骤:装载、链接和初始化。在装载过程中,JVM会查找和导入类或接口的二进制数据;在链接过程中,JVM会执行校验、准备和解析步骤,其中解析步骤是可以选择的;在初始化过程中,...

    Java虚拟机类装载:原理、实现与应用

    首先,类装载的过程分为三个主要阶段:装载、链接和初始化。装载阶段涉及寻找并导入类或接口的二进制数据,通常由类装载器(ClassLoader)执行。链接阶段则包括校验、准备和解析,校验确保二进制数据的正确性,准备...

    jvm类装载器原理

    装载过程包括三个主要步骤:装载、链接和初始化。装载阶段,类装载器依据指定的全限定类名(如`java.lang.Object`)去寻找对应的二进制数据。这个过程可能来源于源代码编译后的字节码文件,也可能来自于网络或其他...

    金蝶Apusic应用服务器V6参考b手册b.doc

    这两个方法的行为有轻微的区别,Class.forName()在类装载完成后,会对类进行初始化,而ClassLoader.loadClass()只负责装载类。 * 隐式类装载发生在由于引用、实例化或继承导致需要装载类的时候。隐式类装载是在幕后...

    Java虚拟机类装载的原理及实现

    在JVM中,类的装载由类装载器(ClassLoader)及其子类完成,主要分为三个阶段:装载、链接和初始化。链接阶段又细分为校验、准备和解析三个步骤。每个步骤都有其特定的功能: 1. **装载**:查找并导入类或接口的二...

    JAVA虚拟机的类装载机制的原理分析与应用研究.pdf

    这一过程涉及到了四个主要角色:类装载器(ClassLoader)、类的二进制表示、验证(Verification)、准备(Preparation)以及初始化(Initialization)。下面我们将逐一解析这些环节。 1. **类装载器**: 类装载器...

    Java虚拟机类装载:原理、实现与应用.doc

    类装载过程不仅涉及基本的类查找和导入,还包含了链接、验证、准备、解析和初始化等多个阶段,这些步骤确保了Java程序的安全性和可靠性。 1. **装载过程**: - **装载**:这个阶段主要是寻找指定的类或接口的二...

    Java类文件动态装载

    Java类的装载过程主要由类加载器(ClassLoader)来完成,这是一个关键组件,它负责查找、加载和初始化类。Java类加载器分为系统类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用...

    Java虚拟机类装载机制

    初始化阶段执行类的静态初始化块和静态变量的赋值操作,激活类的静态初始化代码。 4. **类加载器** 在Java中,类的装载主要由ClassLoader及其子类来实现。ClassLoader是一个抽象类,它有多个子类,如...

    JVM原理详细(推荐)

    这一过程包括三个主要步骤:装载、链接和初始化。 1. **装载**:装载阶段是查找并加载类的二进制数据。这个过程是由 ClassLoader 和其子类完成的。类的名称由类名、包名和 ClassLoader 实例 ID 组成,用来唯一标识...

    Java深度历险(2)--深入类装载器

    3. **初始化**:执行类构造器`<clinit>`方法。 #### 类装载器的层次结构 Java的类装载器遵循一种层次结构,主要包括以下几种类型: 1. **Bootstrap ClassLoader**(启动类装载器):这是JVM自带的类装载器,用于...

    深入JVM内核—原理、诊断与优化视频教程-6. 类装载器

    6. **类的生命周期**:类装载器不仅负责加载类,还参与类的初始化、使用和卸载过程。加载阶段包括找到.class文件并转换为字节码;验证阶段检查字节码是否符合Java规范;准备阶段分配静态变量内存并初始化为默认值;...

    java之jvm学习笔记五(实践写自己的类装载器)

    4. **链接与初始化**:一旦`Class`对象被定义,JVM会进行链接(包括验证、准备和解析)和初始化,使类准备好执行。 自定义类装载器的应用场景广泛,例如实现类的版本控制、热部署、模块化系统等。在开发过程中,你...

    java内核研究--可以初步的了解一些java知识

    这一过程主要分为三个阶段:装载、链接和初始化。其中,链接过程又细分为校验、准备和解析三个步骤。以下是每个步骤的具体说明: 1. **装载**:查找并导入类或接口的二进制数据。这是类装载的第一步,主要任务是...

Global site tag (gtag.js) - Google Analytics