java ClassLoader 总结

开始正式我们的ClassLoader总结分析。

ClassLoader的分类(Hot Spot JVM):

  • BootStrap ClassLoader(启动类加载器)
  • Extension ClassLoader(扩展类加载器)
  • Application ClassLoader(应用程序类加载器)
  • User ClassLoader(用户自己实现的加载器)

BootStrap ClassLoader

C++实现。加载JVM自身需要的类,负责将{JAVA_HOME}/lib路径下的核心类库或者-Xbootclasspath指定的路径下的jar包加载到内存中。说到这我就有个问题,那我们可不可以将jar包直接丢进对应的路径下,让BootStrap ClassLoader自动帮我们进行加载呢?应该是不行的,为什么呢?因为BootStrap ClassLoader是根据文件名进行匹配加载,也就是说,它只加载包名为java、javax、sun等开头的类。


Extension ClassLoader

Java实现。负责加载/lib/ext目录下面或者系统变量-Djava.ext.dir指定路径中的类。

源代码如下所示:

//ExtClassLoader类中获取路径的代码
private static File[] getExtDirs() {
     //加载/lib/ext目录中的类库
     String s = System.getProperty("java.ext.dirs");
     File[] dirs;
     if (s != null) {
         StringTokenizer st =
             new StringTokenizer(s, File.pathSeparator);
         int count = st.countTokens();
         dirs = new File[count];
         for (int i = 0; i < count; i++) {
             dirs[i] = new File(st.nextToken());
         }
     } else {
         dirs = new File[0];
     }
     return dirs;
 }

Application ClassLoader

主要负责加载java -classpath或者-D java.class.path底下的类库。他也是跟我程序员打交道最多的类加载器。

双亲委派模式

工作原理

java ClassLoader 总结_第1张图片

从图中我们可以看出来,当一个类加载器收到了需要加载请求的时候,并不会自己先去加载,而是将任务丢给它的父类,当父类还有父类的时候,继续重复上一次的操作,倘若父类加载器无法完成加载任务,这个时候子类才会进行尝试加载。这就是双亲委派模型,简称坑爹模型

为什么要这样子做呢?

1.可以避免类的重复加载,当父类已经加载了该类的时候,子类就没有必要进行重复加载了。
2.安全原因,假设你想要加载一个自定义的java.lang.String类的话,当双亲委派模型找到了顶层加载器,发现在核心API中已经定义了当前类,就不会在此加载此类,防止api被篡改。

你可能感兴趣的:(java ClassLoader 总结)