Java中有三种ClassLoader
1. Bootstrap class loader:
用于加载java语言规范所定义的标准库的类,比如String,ArrayList,Object等。
它通常是在虚拟机种用本地代码(如C)实现,在系统中用null表示。
这里之所以返回null,与其说是技术原因,到不如说更多得是出于安全考虑。
试想,如果我们能够获得这个ClassLoader的引用,那么我们就可以自由的加载或卸载语言标准类的实现了。
2. Extension class loader:
负责加载Java语言可选实现的类。
我机器上的"Java环境中安装的可选包(optional package)"在这个路径中:
D:\DevelopingTools\Java\jdk1.6.0\jre\lib\ext
因此这里面的java包中的类,都会由Extension class loader来加载。
另外:sun,ibm等不同厂商的扩展包会不同。
3. Application class loader:
剩下的,由我们写的,或者由我们引用的类,也就是CLASSPATH上的类有这个加载器加载。
有时候也称为system class loader,Java程序可以通过调用java.lang.getSystemClassLoader()获得它的引用。
上面的讨论也说明了 Java中获取classpath路径下的资源文件 这篇blog中的原因。
应外,关于这些加载器的关系以及调用次序可以参考这篇blog Java Class Loader 。
这里给出一段测试代码来解释这三个ClassLoader(By L同学),跑在sun jdk 1.6上:
public class TestClassLoader {
public static void main(String[] args) {
Object o = new Object();
System.out.println(o.getClass().getClassLoader());
System.out.println(sun.security.pkcs11.Secmod.class.getClassLoader());
System.out.println(TestClassLoader.class.getClassLoader());
}
}
他的输出为:
sun.misc.Launcher$ExtClassLoader@3e25a5
sun.misc.Launcher$AppClassLoader@1a46e30