引言

除了引导类加载器,系统提供的两个最重要的类加载器就是扩展类加载器和应用类加载器了,这篇文章我们就来分析这两种类加载器。

类层次结构

扩展类加载器和应用类加载器都在sun.misc.Launcher类中,是内部类。并且这两个类都有相同的类层次结构。

  1. static class AppClassLoader extends URLClassLoader {}
  2. static class ExtClassLoader extends URLClassLoader {}

这两个类都继承了java.net.URLClassLoader,注意这个类是在net包中,而URLClassLoader继承了SecureClassLoader

  1. public class URLClassLoader extends SecureClassLoader implements Closeable {}

SecureClassLoader在security包中,继承的就是抽象类ClassLoader。

  1. public class SecureClassLoader extends ClassLoader {}

整个类层次结构比较简单,如下图所示:

classLoader.png

SecureClassLoader

SecureClassLoader实现是比较简单的,从注释上来看:

  1. /**
  2. * This class extends ClassLoader with additional support for defining
  3. * classes with an associated code source and permissions which are
  4. * retrieved by the system policy by default.
  5. *
  6. * @author Li Gong
  7. * @author Roland Schemers
  8. */

这个ClassLoader可以用code source和permission来定义类。
SecureClassLoader.png
从这个类的所有方法可以看出来,SecureClassLoader只增加了两个defineClass方法,并没有重写findClass方法。

  1. protected final Class<?> defineClass(String name,
  2. byte[] b, int off, int len,
  3. CodeSource cs)
  4. {
  5. return defineClass(name, b, off, len, getProtectionDomain(cs));
  6. }
  7. protected final Class<?> defineClass(String name, java.nio.ByteBuffer b,
  8. CodeSource cs)
  9. {
  10. return defineClass(name, b, getProtectionDomain(cs));
  11. }

实现也很简单,如果我们不去研究CodeSource的话,这两个方法只是简单的调用了ClassLoader的对应方法,我们这里不对涉及到CodeSource的内容做介绍。