原文代码片段
代码清单7-9 ClassLoader.getClassLoader()方法的代码片段
//JDK 1.8
public final class Class<T> {
/*** Returns the class loader for the class. Some implementations may use* null to represent the bootstrap class loader. This method will return* null in such implementations if this class was loaded by the bootstrap* class loader....*/@CallerSensitivepublic ClassLoader getClassLoader() {
ClassLoader cl = getClassLoader0();if (cl == null)return null;SecurityManager sm = System.getSecurityManager();if (sm != null) {
ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());}return cl;}
该方法的注释明确说明当返回值为null时,表示某个类的加载器使用的是bootstrap class loader。
解析代码片段
java.lang.Class类的getClassLoader()方法用于获取此实体的classLoader,该实体可以是类,数组,接口等。我们知道类加载器类型包括四种,分别是启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)、应用程序类加载器(Application ClassLoader)、用户自定义加载器
我们看个例子:
package my.test;import sun.misc.Launcher;public class Test {
public static void main(String[] args) {
ClassLoader launcherClassLoader = Launcher.class.getClassLoader();System.out.println(launcherClassLoader); //输出nullClassLoader testClassLoader = Test.class.getClassLoader();System.out.println(testClassLoader); // 输出 sun.misc.Launcher$AppClassLoader@19821f}
}
输出:
null
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher
类位于rt.jar包中,由BootstrapClassLoader加载的,而Test 类,由默认加载器,这里是程序类加载器。