类的加载器负责将.class 文件加载到内存中,并生成对应的java.lang.class 对象。
- Bootstrap ClassLoader: 根类加载器
- Extension ClassLoader: 扩展类加载器
- System ClassLoader: 系统类加载器
根类加载器不是java.lang.ClassLoader 的子类,而是由JVM自身实现的。
Extension Classloader 扩展类加载器,负责加载JRE的扩展目录(%JAVA_HOME%/jre/lib/ext) 中JAR包的类。
System ClassLoader 被称为系统类加载器,负责在JVM启动时加载来自java 命令的-classpath 选项、java.class.path 系统属性,
或CLASSPATH环境变量所指定的JAR包和类路径。程序可以通过ClassLoader 的静态方法getSystemClassLoader() 获取系统类加载器。
public class ClasssLoadPropTest {
public static void main(String[] args) throws IOException {
ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemLoader);
Enumeration<URL> eml = systemLoader.getResources("");
while (eml.hasMoreElements()){
System.out.println(eml.nextElement());
}
ClassLoader extensionLoader = systemLoader.getParent();
System.out.println(extensionLoader);
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(extensionLoader.getParent());
}
}
此处可以看到扩展类加载器的父加载器为null,并不是根类加载器,这是因为根类加载器并不是java实现的。
系统类加载器是AppClassLoader的实例,扩展类加载器是ExtClassLoader的实例。
类加载器加载Class的8个步骤。
URLClassLoader 类
URLClassLoader 是系统加载类和扩展类加载器的父类.
下面程序示范如何直接从文件系统中加载MYSQL驱动。