初识Java ClassLoader
Java源代码编译后生产的.class字节码文件并不是直接可运行的文件,还需要借助JVM运行,而加载各种class文件就是ClassLoader的作用所在。

Jvm在运行时会产生三个ClassLoader:
(1)根装载器
其不是ClassLoader的子类,由C++编写,在Java中看不到。负责装载JRE的核心类库,如JRE目录下rt.jar, charSets.jar等。
(2)ExtClassLoader: 扩展类装载器
它是ClassLoader的子类,负责装载JRE扩展目录ext下的类包。
(3)AppClassLoader: 系统类装载器
它也是ClassLoader的子类,负责装载ClassPath下的类包。
【三者的关系: 根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器

可以用以下代码查看父子关系:
public class ClassLoaderTest {
	public static void main(String[] args) {
		ClassLoader aloader = Thread.currentThread().getContextClassLoader();
		System.out.println("current loader: " + aloader);
		System.out.println("parent loader: " + aloader.getParent());
		System.out.println("grandparent loader: " + aloader.getParent().getParent());
	}
}

运行结果如下:
current loader: sun.misc.Launcher$AppClassLoader@73d16e93
parent loader:sun.misc.Launcher$ExtClassLoader@15db9742
grandparent loader: null
从运行结果也可以看出,当前loader为AppClassLoader, 其父级加载器为ExtClassLoader, 其最上级加载器为根加载器,在Java中无法访问,故输出为null。

JVM访问类时采用全盘负责的委托机制全盘负责是指在一个ClassLoader装载类的时候,除非显式的使用另一个ClassLoader, 否则该类所依赖及引用的类也由这个ClassLoader加载。委托机制指的是在加载类时,先委托父加载器查找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。委托机制主要是从安全角度出发,这样设计保证了JVM加载了外部的恶意类。

在CSDN看到了一篇博文,讲解挺详细的:深入分析Java ClassLoader原理
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门