类加载器

由来

引入类加载器这个概念是为了满足Java Applet开发的需求,就是为了能执行从远程下载过来的Java类
能执行。后来给予jvm的动态不熟,插件化开发等技术,都是来源于jvm引入了类加载机制。

加载器

ClassLoader(类加载器):Java编写代码的文件为.java文件,编译器会将这个文件编译成Java字节码
文件也就是.class文件,jvm运行时会新招包含main方法的类。其中,把这个class文件中的字节码数据
读入jvm,转化成jvm中运行时对应的class对象,执行这个动作的就叫类加载器。
ClassLoader:是Java层几乎所有的类加载器的父类,它定义了加载器基本行为和加载动作。

类加载的过程

类在jvm中生存的生命周期

加载-->验证-->准备-->解析-->初始化-->使用-->卸载

类加载过程

加载-->验证-->准备-->解析-->初始化 5个步骤,
加载(装载):查找和导入Class文件。
验证:检查载入Class文件数据的正确性。
准备:给类的静态变量分配存储空间。
解析:将符号引用转成直接引用。
初始化:对类的静态变量,静态代码块执行初始化操作。
其中:验证、准备、解析:一般统称为连接。

类加载的时机

当Java程序首次通过下面6种方式来使用某个类或接口时,系统就会初始化该类或接口
1.创建类的实例,方式包括:new操作符创建实例,通过反射创建实例,通过反序列化创建实例。
2.调用某个类的类方法(静态方法)
3.访问某个类或接口的类变量,或为该类变量赋值。
4.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。例如:Class.forName("Person")
,如果系统还未初始化Person类,则这个代码会将该Person类初始化。
5.初始化某个类的子类,初始化子类时该子类的所有父类都会被初始化。
6.直接使用java.exe命令来运行某个主类。

分类

1:BootStrap ClassLoader(启动类加载器):负责将一些核心的/lib/目录,
被JVM识别的类加载进来,用C++实现与jVM是一体的。
2:Extension ClassLoader(扩展类加载器):用来加载Java的扩展库。
3:Application ClassLoader(应用程序类加载器):用于加载我们自定义编写的类。
4:User ClassLoader(用户自己实现的加载器):根据自己需要掌控类加载过程用到。

工作过程

我们的应用程序都是由这三种类加载器配合使用的。
eg:双亲委派模型 引导类加载器<---扩展类加载器<--系统类加载器
过程:一个类加载器接受到类加载请求,它首先会委托给它的父类加载器去完成,每层类加载器都是如此,传递
到定就是启动类加载器,当父类取法完成加载请求时,子加载器才尝试自己去加载。

你可能感兴趣的:(类加载器)