双亲委派加载模型
为什么需要双亲委派加载模型
主要是为了安全,避免用户恶意加载破坏JVM
正常运行的字节码文件,比如说加载一个自己写的java.util.HashMap.class
。这样就有可能造成包冲突问题。
类加载器种类
- 启动类加载器:用于加载
jdk
中rt.jar
的字节码文件 - 扩展类加载器:用于加载
jdk
中/jre/lib/ext
文件夹下的字节码文件 - 应用程序类加载器:加载
classPath
下的字节码文件 - 自定义类加载器:用户在程序中自己定义的加载器
源码分析
1、ClassLoader.loadClass()
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// 加锁
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
// 如果这个Class对象还没有被加载,下面就准备加载
if (c == null) {
long t0 = System.nanoTime();
try {
// 查看当前类加载器有没有父类加载器
if (parent != null) {
// 父类加载器来加载字节码文件
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
// 如果父类加载器也没有加载这个Class对象,就由自己来加载
if (c == nu