class.forname和classloader區別
Java中class是如何載入到JVM中的: 1.class載入到JVM中有三個步驟 裝載:(loading)找到class對應的位元組碼檔案。 連線:(linking)將對應的位元組碼檔案讀入到JVM中。 初始化:(initializing)對class做相應的初始化動作。 2.Java中兩種載入class到JVM中的方式 2.1:Class.forName(“className”); 其實這種方法調運的是:Class.forName(className, true, ClassLoader.getCallerClassLoader())方法 引數一:className,需要載入的類的名稱。 引數二:true,是否對class進行初始化(需要initialize) 引數三:classLoader,對應的類載入器 2.2:ClassLoader.laodClass(“className”); 其實這種方法調運的是:ClassLoader.loadClass(name, false)方法 引數一:name,需要載入的類的名稱 引數二:false,這個類載入以後是否需要去連線(不需要linking) 2.3:兩種方式的區別 forName("")得到的class是已經初始化完成的 loadClass("")得到的class是還沒有連線的 一般情況下,這兩個方法效果一樣,都能裝載Class。 但如果程式依賴於Class是否被初始化,就必須用Class.forName(name)了。
3.舉例說明他們各自的使用方法 java使用JDBC連線資料庫時候,我們首先需要載入資料庫驅動。 Class.forName(“com.mysql.jdbc.Driver”);//通過這種方式將驅動註冊到驅動管理器上 Connection conn = DriverManager.getConnection(“url”,“userName”,“password”);//通過驅動管理器獲得相應的連線 檢視com.mysql.jdbc.Driver原始碼:
public class Driver extends NonRegisteringDriver implements java.sql.Driver { //注意,這裡有一個static的程式碼塊,這個程式碼塊將會在class初始化的時候執行 static { try { //將這個驅動Driver註冊到驅動管理器上 DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException(“Can’t register driver!”); } } }
Class.forName(“com.mysql.jdbc.Driver”)方法以後,他會進行class的初始化,執行static程式碼塊。 也就是說class初始化以後,就會將驅註冊到DriverManageer上,之後才能通過DriverManager去獲取相應的連線。 但是要是我們使用ClassLoader.loadClass(com.mysql.jdbc.Driver)的話,不會link,更也不會初始化class。 相應的就不會回將Driver註冊到DriverManager上面,所以肯定不能通過DriverManager獲取相應的連線。