类加载的全过程

类加载机制:

  JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成JVM可以直接使用的java类型的过程。

 一、加载

      JVM将class文件字节码内容加载到内存,并将静态的数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。这个过程需要类加载器参与。

二、链接:将java类的二进制代码合并到JVM的运行状态之中的过程

1.验证:确保加载的类信息符合JVM规范没有安全方面问题

2.准备:正式为类变量(static变量)分配内存设置类变量初始值的阶段,这些内存都在方法区中进行分配。

3.解析:虚拟机常量池内的符号引用替换成直接引用的过程

三、初始化

       初始化阶段是执行类构造器方法的过程,类构造器方法是由编译器自动收集类中的所有变量的赋值动作和静态语句块的语句合并产生。

         当初始化一个类的时候,如果其父类还没有进行过初始化,需要先初始化其父类

         虚拟机会保证一个类的方法在多线程环境中被正确加锁和同步。

四、类的引用

1.主动引用(一定会发生类的初始化):

         a.  new一个类的对象

         b.  调用类的静态成员和静态方法

         c.  使用java.lang.reflect包的方法对类进行反射调用

         d.  当虚拟机启动,会先启动main方法所在的类。

         e. 当初始化一个类,如果其父类没有被初始化,会先初始化它的父类

2.被动引用(不会发生类的初始化):

          a.当访问一个静态域的时候,只有真正声明这个域的类才会被初始化,通过子类引用父类的静态变量,不会导致子类初始化

          b.通过数组定义类引用,不会触发此类初始化

          c.引用常量不会触发此类的初始化         

         

类加载器的层次结构:

a.引导类加载器  Bootstrap class loader

       它用来加载 Java 的核心库(JAVA_HOME/jre/lib/rt.jar,或sun.boot.class.path路径下的内容),是用原生代码来实现的,并不继承自 java.lang.ClassLoader。– 加载扩展类和应用程序类加载器。并指定他们的父类加载器。
 

b.扩展类加载器  extension class loader

      用来加载 Java 的扩展库(JAVA_HOME/jre/ext/*.jar,或java.ext.dirs路径下的内容) 。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java类。

c.应用程序类加载器  application class loader

      它根据 Java 应用的类路径(classpath,java.class.path 路径下的内容)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。
 

d.自定义加载器  java.lang.Classloader

      通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。
 

类加载器的代理模式

代理模式----交给其他的加载器来加载指定的类

双亲委托机制------就是某个特定的类加载器在接到加载类的请求是,先将加载任务委托给父类加载器,一直追溯到顶,如果超类能加载完成,就直接返回成功,如果超类不能完成就自己去加载类。

这种机制保证了不会出现用户自己能定义java.lang.object类的情况。

但并不是所有的类加载器都采用这个双亲委托机制

如tomcat就跟它不一样,它会先去自己加载,加载不成功再找它的超类来加载

自定义类加载器的流程:


1、首先检查请求的类型是否已经被这个类装载器装载到命名空间中了,如果已经装载,直接返回;否则转入步骤2
2、委派类加载请求给父类加载器(更准确的说应该是双亲类加载器,真个虚拟机中各种类加载器最终会呈现树状结构),如果父类加载器能够完成,则返回父类加载器加载的Class实例;否则转入步骤3
3、调用本类加载器的findClass(…)方法,试图获取对应的字节码,如果获取的到,则调用defineClass(…)导入类型到方法区;如果获取不到对应的字节码或者其他原因失败,返回异常给loadClass(…), loadClass(…)转抛异常,终止加载过程(注意:这里的异常种类不止一种)。
 注意:被两个类加载器加载的同一个类,JVM不认为是相同的类。
 

猜你喜欢

转载自blog.csdn.net/weixin_41987553/article/details/82724227
今日推荐