当前位置: 代码迷 >> 综合 >> 【深入理解java虚拟机v3】双亲委派模型 代码清单7-9 ClassLoader.getClassLoader()方法的代码片段
  详细解决方案

【深入理解java虚拟机v3】双亲委派模型 代码清单7-9 ClassLoader.getClassLoader()方法的代码片段

热度:37   发布时间:2024-02-28 12:27:30.0

原文代码片段

代码清单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 类,由默认加载器,这里是程序类加载器。

  相关解决方案