1. 程式人生 > >class.forname和classloader區別

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獲取相應的連線。