Blog

It's a Wonderful Life

java的类加载器

2017-03-14 23:16 Posted in Learn with Java

java的类加载器分为三种:

  • 引导类加载器(Bootstrap Class Loader)
  • 扩展类加载器(Extension Class Loader)
  • 系统类加载器(System Class Loader)

引导类加载器负责加载系统类(通常从JAR文件rt.jar中进行加载)。它是虚拟机不可分割的一部分,而且通常是用C语言实现的。引导类加载器没有对应的ClassLoader对象。例如:

	String.class.getClassLoader()

将返回null

扩展类加载器用于从jre/lib/ext/目录下加载“标准的扩展”。可以将JAR文件放入这个目录,这样在程序中即使没有指明类路径,扩展类加载器也能找到要加载的类,然而在这个JAR文件中如果有一个类需要调用系统类或者扩展类,就会遇到麻烦。扩展类加载器并不使用类路径。

系统类加载器负责加载应用类,通常是在CLASSPATH环境变量或者-classpath命令行选项设置的类路径中的目录里或者是JAR/ZIP文件中里查找这些类。

在Oracle的java实现中,扩展类加载器和系统类加载器都是用java来实现的。它们都是URLClassLoader类的实例。

特别地,类加载器有一种父/子关系。除了引导类加载器外,每个类加载器都有一个父加载器。根据规定,类加载器会为它们的父类加载器提供一个执行机会,以便加载任何给定的类。并且只有在父类加载器加载失败的时候,它才会加载该类。例如,当要求系统类加载器加载一个系统类(比如java.util.ArrayList)时,它首先要求扩展类加载器进行加载,而该扩展类加载器则首先要求引导类加载器进行加载。引导类加载器加载rt.jar中的这个类,而无需从其他类加载器中进行任何搜索。