問題: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