1. 程式人生 > >Java基礎之ClassLoader類載入器簡介

Java基礎之ClassLoader類載入器簡介

classloader簡介

1 classloader層次結構(父子關係)

Bootstrap(ClassLoader)

  • ExtClassLoader
    • AppClassLoader
      • XXXClassLoader

詳見程式碼如下:

sun.misc.Launcher
public Launcher() {

        Launcher.ExtClassLoader var1;

        try {

            var1 = Launcher.ExtClassLoader.getExtClassLoader();

        } catch (IOException var10) {

            throw new InternalError("Could not create extension class loader", var10);

        }

 

        try { this.loader = Launcher.AppClassLoader.getAppClassLoader(var1); } catch (IOException var9) { throw new InternalError("Could not create application class loader", var9); }

2 classloader載入類過程

classloader在載入class時優先嚐試通過parent classloader載入,如果載入不到,才嘗試自己載入,即常說的“雙親委派”,

並且如果一個class依賴其他class,比如ClassA依賴ClassB,ClassB預設由ClassA的classloader來載入。

* <p> The methods and constructors of objects created by a class loader may
* reference other classes. To determine the class(es) referred to, the Java
* virtual machine invokes the {@link #loadClass <tt>loadClass</tt>} method of
* the class loader that originally created the class.

詳見程式碼如下:

java.lang.ClassLoader
protected Class<?> loadClass(String name, boolean resolve)

        throws ClassNotFoundException

    {

        synchronized (getClassLoadingLock(name)) {

            // First, check if the class has already been loaded

            Class<?> c = findLoadedClass(name);

            if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader  } if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name); // this is the defining class loader; record the stats  sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } }