类加载器层级关系 - 图1

类加载器层级关系 - 图2

ClassLoaderUtils

  • BootstrapLoader
  • ExtClassLoader
  • AppClassLoader(SystemClassLoader) ```java package com.javabook.classloader.utils;

import java.io.IOException; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Stack;

/**

  • @author Summer Lu
  • @email gmluyang@gmail.com
  • @date 2014-8-25 / public class ClassLoaderUtils {

    /**

    • @return */ public static ClassLoader getBootstrapLoader() { return getExtClassLoader().getParent(); }

      /**

    • @return */ public static ClassLoader getExtClassLoader() { return getAppClassLoader().getParent(); }

      /**

    • @return */ public static ClassLoader getAppClassLoader() { return ClassLoader.getSystemClassLoader(); }

      /**

    • @return */ public static ClassLoader getThreadClassLoader() {

      ClassLoader classLoader = null; try {

      1. classLoader = Thread.currentThread().getContextClassLoader();

      } catch (Exception e) {

       e.printStackTrace();
      

      } return classLoader; }

      /**

    • @return */ public static ClassLoader getCurrentClassLoader() { return ClassLoaderUtils.class.getClassLoader(); }

      /**

    • @return */ public static ClassLoader[] getHierarchyClassLoadersDesc() {
      List hierarchyClassLoaders = new ArrayList(); getHierarchyClassLoaders(hierarchyClassLoaders, getCurrentClassLoader()); Collections.reverse(hierarchyClassLoaders); return hierarchyClassLoaders.toArray(new ClassLoader[hierarchyClassLoaders.size()]); }

      /**

    • @param classLoaders
    • @param currentClassLoader
    • @return */ private static void getHierarchyClassLoaders(Collection classLoaders, ClassLoader currentClassLoader) { classLoaders.add(currentClassLoader); if(currentClassLoader!=null) {

       ClassLoader parentClassLoader = currentClassLoader.getParent();
       getHierarchyClassLoaders(classLoaders, parentClassLoader);
      

      } }

      /* */ public static void printHierarchyClassLoadersDesc() { ClassLoader[] classLoaders = getHierarchyClassLoadersDesc();

      StringBuffer classLoaderTree = new StringBuffer(); for (int i = 0; i < classLoaders.length; i++) {

       ClassLoader classLoader = classLoaders[i];
      
       for (int j = 0; j < i+1; j++) {
           classLoaderTree.append("-");
       }
      
       if(classLoader==null)
           classLoaderTree.append("null").append("\n");
       else
           classLoaderTree.append(classLoader.toString()).append("\n");
      

      }

      System.out.println(classLoaderTree); } }


<a name="the-console-of-the-classloaderutils"></a>
# ClassLoaderUtilsMain

- ExtClassLoader

![image.png](https://cdn.nlark.com/yuque/0/2020/png/179935/1609261112631-3ff7bac5-d7cc-4699-b554-cdffbcb05544.png#align=left&display=inline&height=349&margin=%5Bobject%20Object%5D&name=image.png&originHeight=349&originWidth=642&size=39541&status=done&style=none&width=642)
```java
package com.javabook.classloader.utils;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.*;

/**
 * @author Summer Lu
 * @email gmluyang@gmail.com
 * @date 2014-8-25
 *
 */
public class ClassLoaderUtilsMain {

    /**
     * @param args
     * @throws IOException
     * @throws URISyntaxException
     */
    public static void main(String[] args) throws IOException, URISyntaxException {

        System.out.println("BootstrapLoader:"   + ClassLoaderUtils.getBootstrapLoader());
        System.out.println("ExtClassLoader:"    + ClassLoaderUtils.getExtClassLoader());
        System.out.println("AppClassLoader:"    + ClassLoaderUtils.getAppClassLoader());

        System.out.println("----------------------------------------------------------------");

        System.out.println("\nHierarchy-ClassLoadersDesc:");
        ClassLoaderUtils.printHierarchyClassLoadersDesc();

        System.out.println("----------------------------------------------------------------");

        System.out.println("java.lang.String.class.getClassLoader():" + java.lang.String.class.getClassLoader());
        System.out.println("com.sun.java.accessibility.util.AWTEventMonitor.class.getClassLoader():" + com.sun.java.accessibility.util.AWTEventMonitor.class.getClassLoader());
        System.out.println("ClassLoaderUtilsMain.class.getClassLoader():" + ClassLoaderUtilsMain.class.getClassLoader());
        System.out.println("Thread.currentThread().getContextClassLoader():" + Thread.currentThread().getContextClassLoader());
    }
}

Console

BootstrapLoader:null
ExtClassLoader:sun.misc.Launcher$ExtClassLoader@74a14482
AppClassLoader:sun.misc.Launcher$AppClassLoader@18b4aac2
----------------------------------------------------------------

Hierarchy-ClassLoadersDesc:
-null
--sun.misc.Launcher$ExtClassLoader@74a14482
---sun.misc.Launcher$AppClassLoader@18b4aac2

----------------------------------------------------------------
java.lang.String.class.getClassLoader():null
com.sun.java.accessibility.util.AWTEventMonitor.class.getClassLoader():sun.misc.Launcher$ExtClassLoader@74a14482
ClassLoaderUtilsMain.class.getClassLoader():sun.misc.Launcher$AppClassLoader@18b4aac2
Thread.currentThread().getContextClassLoader():sun.misc.Launcher$AppClassLoader@18b4aac2

Process finished with exit code 0