Java中的類載入和Class.forName()
對於大部分人來說,第一次見到class.forName(String className)這句程式碼應該是在使用jdbc方式連線資料庫的時候。但這句程式碼本質上是什麼含義,做了什麼工作呢?本文將回答此問題。
Class類概念
Class類用來描述一個類的結構,比如描述一個類有哪些成員,有哪些方法等。有多種方法可以獲取一個類對應的Class類例項,比如:
- //第一種方式獲取描述Dog類結構的Class類例項
- Class<Dog> clazz = Dog.class;
- //第二種方式
- Dog d = new Dog();
-
Class<Dog> clazz = d.getClass();
類載入概念
當使用一個類的時候(比如new一個類的例項),jvm會檢查此類是否被載入到記憶體,如果沒有,則會執行載入操作,載入操作的內容是,讀取類對應的class檔案資料,解析此資料,構造一個此類對應的Class類的例項,此Class類的例項描述了類的結構,並且提供了呼叫此類成員的介面。此時jvm就可以使用該類了,比如例項化此類,或者呼叫此類的靜態方法。
Java也提供了手動載入類的介面,class.forName()方法就是其中之一。
初始化引數指定的類,並且返回此類對應的Class例項。
類初始化概念
類被載入之後,jvm已經獲得了一個描述類結構的Class例項。但是還需要進行類初始化操作之後才能正常使用此類,類初始化操作就是執行一遍類的靜態語句,包括靜態變數的宣告還有靜態程式碼塊。
Class.forName方法
此方法含義是:載入引數指定的類,並且初始化它。
在jdbc連線資料庫中的應用
到這裡,不用解釋,讀者也會明白,在使用jdbc方式連線資料庫時,為什麼要執行Class.forName('驅動類名')方法了:將驅動類的class檔案裝載到記憶體中,並且形成一個描述此驅動類結構的Class類例項,並且初始化此驅動類,這樣jvm就可以使用它了,這就是Class.forName()方法的含義。
(參考《jdbc註冊驅動的三種方式》http://blog.csdn.NET/yanwushu/article/details/7574708),
資源
1. http://www.iteye.com/topic/15039
2. Class.forName和ClassLoader.loadClass的比較 http://blog.csdn.net/lu7kang/article/details/5576043