ClassLoader 作用动态的加载class文件到内存中。
Java 默认提供三个ClassLoader
BootStrapClassLoader
最底层的加载器,负责加载JDK中的核心类库,通过程序可以知道它负责加载那些相关的jar或class
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i].toExternalForm());
}
或者
System.out.println(System.getProperty("sun.boot.class.path").replaceAll(";", "\n"));
输出:
C:\jdk1.6.0_30\jre\lib\resources.jar
C:\jdk1.6.0_30\jre\lib\rt.jar
C:\jdk1.6.0_30\jre\lib\sunrsasign.jar
C:\jdk1.6.0_30\jre\lib\jsse.jar
C:\jdk1.6.0_30\jre\lib\jce.jar
C:\jdk1.6.0_30\jre\lib\charsets.jar
C:\jdk1.6.0_30\jre\lib\modules\jdk.boot.jar
C:\jdk1.6.0_30\jre\classes
ExtensionClassLoader
加载Java的扩展类,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar.
AppClassLoader
加载应用程序classpath目录下的所有jar和class文件.
- windows
PATH=%PATH%; C:\Program Files\Java\jdk1.6.0_26\bin
- Linux
PATH=${PATH}:/home/opt/jdk1.6.0_26/bin
JAVA_HOME
System.getProperty(“java.home”)
- windows
JAVA_HOME=C:\Program Files\Java\JDK1.6\
- Linux
JAVA_HOME=/opt/java/jdk_1.6
ClassPath
System.getProperty(“java.class.path”)
- windows
CLASSPATH=%CLASSPATH%;JAVA_HOME\lib;
- Linux
CLASSPATH=/home/tester/classes
ClassNotFoundException 和 NoClassDefFoundError
- 在调用Class.forName() or
loadClass()方法在运行时动态加载类对象.如果在classpath中没有找到就会抛出ClassNotFoundException - 要查找的类在编译的时候是存在的,运行的时候却找不到了,就会抛出 NoClassDefFoundError
,如编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误.
注意:
除了Java默认提供的三个ClassLoader之外,用户还可以根据需要定义自已的ClassLoader,而这些自定义的ClassLoader都必须继承自java.lang.ClassLoader类,也包括Java提供的另外二个ClassLoader(Extension ClassLoader和App ClassLoader)在内,但是Bootstrap ClassLoader不继承自ClassLoader,因为它不是一个普通的Java类,底层由C++编写,已嵌入到了JVM内核当中,当JVM启动后,Bootstrap ClassLoader也随着启动,负责加载完核心类库后,并构造Extension ClassLoader和App ClassLoader类加载器.