java收录

JVM学习(二)类加载器

2018-08-02  本文已影响7人  J先生有点儿屁

目录


一、类加载器

还记得类加载机制吗?类加载机制的各阶段是加载、连接(验证、准备、解析)、初始化、使用、卸载。可参考上篇文章:JVM学习(一):Java类的加载机制 里有详细说明。

1. 什么是类加载器?

把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。

2. 类与类加载器

类加载器虽然只用于实现类的加载动作,但它在Java程序中祈祷的作用却远远不限于类加载阶段。
对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立啊Java虚拟机中的唯一性。每一个类加载器都拥有一个独立的类名称空间。
比较两个类是否“相等“,只有在这两个类是由同一个类加载器加载的前提下才由意义;否则,即使两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么这两个类就必定不相等。
(这里指的“相等”,包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果,也包括关键字instanceof做对象所属关系判定情况。)

从示例代码Object obj = loader.loadClass("com.jx.Test1").newInstance(); System.out.println(obj.getClass());打印结果是com.jx.Test1,说明通过自定义的类加载器 加载并实例的对象确实是Tes1的类;
但代码System.out.println(obj instanceof com.jx.Test1);运行输出的结果是false,这是因为在JVM虚拟机中存在另外一个类加载器加载了。
虽然都是来自同一个Class文件,但因为是两个独立的类加载器加载出来的类,在做对象所属类型检测时结果是false。

二、类加载器分类

类加载器

1. 启动类加载器(Bootstrap ClassLoader)

启动类加载器(Bootstrap ClassLoader) 是最顶层的类加载器,主要加载核心类库。

2. 扩展类加载器(Extension ClassLoader)

扩展类加载器(Extension ClassLoader):这个类加载器由sun.misc.Luancher&ExtClassLoader实现。

3. 应用程序类加载器(Application ClassLoader)

应用程序类加载器(Application ClassLoader):是由sun.misc.Launcher&ApplicationClassLoaer实现。

4. 自定义类加载器(User ClassLoader)

**自定义类加载器(User ClassLoader)
**:一般是继承ClassLoader,重写findClass方法。
因为JVM自带的ClassLoader只会从本地文件系统加载标准的Java class文件,因此编写自定义类加载器可以做到:

5. 类加载器体系结构(双亲委派模型)

类加载器体系结构

关于类加载器的加载过程:

上面的流程又可以称为是双亲委派模型。

双亲委派模型
双亲委派模型流程 双亲委派模型加载流程

6. 类的加载方式

类的加载方式有三种:

三、ClassLoader代码解读-双亲委派模型

通过上面的《通过ClassLoader.loadClass()方法动态加载》已经将双亲委派模型已经详细讲解了。
部分补充请查看:
JVM学习(二)续1-ClassLoader代码解读-双亲委派模型

四、自定义类加载器详解

请参考另外一篇文章中有详细讲解。
JVM学习(二)续2-自定义类加载器详解

上一篇 下一篇

猜你喜欢

热点阅读