Class.forName("xxx")調用過程

問題:java.lang.ClassNotFoundException java


1.Class.forName("xxx")做用概述 sql

    xxx:字符串,表示要裝載的類名或者是驅動名字。 api

   Class.forName()的主要做用是將「xxx」表示的類裝載到JAVA虛擬機中。 this

2.Class.forName("xxx")具體加載過程 spa

    解決的問題: .net

  •          「xxx」表示類的字節碼應該放在哪裏?
  •         Class.forName("xxx")調用過程的相關的類、對象和系統環境?
  •         設計Class.forName("xxx")的意義?

2.1 Class.forName("xxx")尋找過程細節? 設計

     這裏主要解決前兩個問題—— 「xxx」表示類的字節碼應該放在哪裏?和Class.forName("xxx")調用過程的相關的類、對象和系統環境? code

java.sql.DriverManager.registerDriver(new Driver());【1】

在這篇博文中,表示java.sql.DriverManager是在Class.forName("xxx")中的xxx類放入內存後,才靜態註冊驅動類。可是JVM如何將xxx放入內存呢?下面是Class類中forName()的源代碼 對象

    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        return forName0(className, true, ClassLoader.getCallerClassLoader());
    }
 private static native Class<?> forName0(String name, boolean initialize,
                                            ClassLoader loader)
        throws ClassNotFoundException;


    public static Class<?> forName(String name, boolean initialize,
                                   ClassLoader loader)
        throws ClassNotFoundException
    {
        if (loader == null) {
            SecurityManager sm = System.getSecurityManager();
            if (sm != null) {
                ClassLoader ccl = ClassLoader.getCallerClassLoader();
                if (ccl != null) {
                    sm.checkPermission(
                        SecurityConstants.GET_CLASSLOADER_PERMISSION);
                }
            }
        }
        return forName0(name, initialize, loader);
    }
 
 

從上述的Class類的相關方法,能夠看出forName()方法的實現還跟ClassLoader類有關。 blog

static ClassLoader getCallerClassLoader() {
        // NOTE use of more generic Reflection.getCallerClass()
        Class caller = Reflection.getCallerClass(3);
        // This can be null if the VM is requesting it
        if (caller == null) {
            return null;
        }
        // Circumvent security check since this is package-private
        return caller.getClassLoader0();
    }
這個是forName0(String,boolean,ClassLoader)中ClassLoader類調用的其自身的靜態方法getCallerClassLoader()的實現代碼。而實現代碼中,又個Reflection類有關,調用了其靜態方法getCallerClass(3)。那麼,這個3是什麼意思呢?沒法查看源代碼。


而後,百度了」getCallerClass(3)「,在一篇博文【2】中介紹了幾種Classloader類,以及它們須要加載庫的範圍

  •     Bootstrap ClassLoader - GetClassLoader的返回值爲Null,是JVM的C++源碼, Ext ClassLoader 的Parent主要負責jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項指定的jar包裝入工做
  •     System ClassLoader -  GetClassLoader返回值爲SystemClassLoader. 主要負責java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工做
  •      Ext ClassLoader  - 是AppClassLoader 的Parent 返回Ext ClassLoader 主要負責jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工做。
  •      App ClassLoader - 返回AppClassLoader。主要負責加載用戶類
  •       Customer Class Loader  - 通常都繼承App ClassLoader 用戶自定義。



參考:

    http://blog.csdn.net/youlingqishi11/article/details/7395716

    http://blog.csdn.net/dianxer/article/details/6255823

相關文章
相關標籤/搜索