类加载的过程(简单介绍)

目录

一、类加载过程一览

 加载:

验证:

准备:

解析:

初始化:

二:类加载器分类

启动类加载器(bootstrap class loader)

扩展类加载器(extensions class loader)

应用程序类加载器(application class loader)

自定义类加载器

三:类加载器的代理模式

双亲委派模型


一、类加载过程一览

类加载的过程(简单介绍)_第1张图片

 加载:

将硬盘上的Java二进制文件(class文件)转为内存中的Class对象

验证:

确保加载入内存的class文件没有问题

准备:

正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。注意此时的设置初始值为默认值,具体赋值在初始化阶段完成

解析:

虚拟机常量池内的符号引用替换为直接引用(地址引用)的过程。

初始化:

执行类变量(静态变量)的赋值动作和静态语句块(按定义的顺序从上往下执行)

1、父类的静态变量
2、父类的静态代码块
3、子类的静态变量
4、子类的静态代码块
5、父类的非静态变量
6、父类的非静态代码块
7、父类的构造方法
8、子类的非静态变量
9、子类的非静态代码块
10、子类的构造方法

二:类加载器分类

类加载的过程(简单介绍)_第2张图片

 

启动类加载器(bootstrap class loader)


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

扩展类加载器(extensions class loader)


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

应用程序类加载器(application class loader)


(1)它根据 Java 应用的类路径(classpath,java.class.path 路径下的内容)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。
(2)由sun.misc.Launcher$AppClassLoader实现。

自定义类加载器


(1)开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

三:类加载器的代理模式

双亲委派模型

它是首先尝试去加载某个类,如果找不到再代理给父类加载器

类加载的过程(简单介绍)_第3张图片

 

 

你可能感兴趣的:(java)