java虚拟机中可以安装多个列加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:
BootStrap ExtClassLoader AppClassALoader
public class ClassLoaderDemo01 {
public static void main(String[] args) {
System.out.println(ClassLoaderDemo01.class.getClassLoader().getClass()
.getName());
}
}
运行结果是:sun.misc.Launcher$AppClassLoader
System.out.println(System.class.getClassLoader());
输入结果是null.说明System的类加载器是BootStrap
1.得出类加载器的关系图
ClassLoader loader = ClassLoaderDemo01.class.getClassLoader();
while (loader != null) {
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);
输出的结果是:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null
这样可以得出类加载器的关系图:BootStrap ExtClassLoader AppClassALoader
2.如何将自己写的类使用ExtClassLoader加载
ClassLoaderDemo01 本来的类加载器是AppClassALoader,现在我们使用ExtClassLoader 来加载。
将Demo01输入到JDK->JRE->lib->ext目录下,重新运行,可以发现,这时候加载的类加载器为:ExtClassLoader
BootStrap(加载JRE/lib/rt.jar)
ExtClassLoader(加载JRE/lib/ext/*.jar)
AppClassALoader(加载classpath指定的所有jar和目录)
3.当我们的源程序用到了一个类,这时候,我们应该用哪个内加载器去加载呢?
(1)首先派当前线程的类加载器去加载第一个类。每个线程都有一个叫做上下文加载器,set/getContextClassLoader,你可以为这个线程指定一个类加载器.这个线程遇到了某个类,就派这个类加载器去加载.
(2)如果类A中引用了类B,java虚拟机将使用加载类A的类加载器来加载类B.
(3)还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类.
每个类加载器加载类时,