在Java的反射中,Class.forName和ClassLoader的區別

 

日英文php

Instead of giving yourself reasons why you can't, give yourself reasons why you can. java

與其爲「我不能」找藉口,不如爲「我能」找緣由。程序員

每日掏心話面試

好的東東就是有着五雷轟頂通常的力量!咱們的心靈在它們面前宛如透明,經常不堪一擊!但我多麼喜歡被這些美擊敗得潰不成軍的身體殘片啊!   

   正文   數據庫

在 java 中 Class.forName() 和 ClassLoader 均可以對類進行加載。ClassLoader 就是遵循雙親委派模型最終調用啓動類加載器的類加載器,實現的功能是「經過一個類的全限定名來獲取描述此類的二進制字節流」,獲取到二進制流後放到 JVM 中。Class.forName() 方法實際上也是調用的 CLassLoader 來實現的。
Class.forName(String className);這個方法的源碼是:最後調用的方法是 forName0 這個方法,在這個 forName0 方法中的第二個參數被默認設置爲了 true,這個參數表明是否對加載的類進行初始化,設置爲 true 時會類進行初始化,表明會執行類中的靜態代碼塊,以及對靜態變量的賦值等操做。也能夠調用 Class.forName(String name, boolean initialize,ClassLoader loader) 方法來手動選擇在加載類的時候是否要對類進行初始化。Class.forName(String name, boolean initialize,ClassLoader loader) 的源碼以下:源碼中的註釋只摘取了一部分,其中對參數 initialize 的描述是:if {@code true} the class will be initialized. 意思就是說:若是參數爲 true,則加載的類將會被初始化。
搜索公衆號後端架構師後臺回覆「面試」,獲取一份驚喜禮包。舉例:下面仍是舉例來講明結果吧:一個含有靜態代碼塊、靜態變量、賦值給靜態變量的靜態方法的類。測試方法:運行結果:根據運行結果得出 Class.forName 加載類是將類進了初始化,而 ClassLoader 的 loadClass 並無對類進行初始化,只是把類加載到了虛擬機中。應用場景在咱們熟悉的 Spring 框架中的 IOC 的實現就是使用的 ClassLoader。而在咱們使用 JDBC 時一般是使用 Class.forName() 方法來加載數據庫鏈接驅動。這是由於在 JDBC 規範中明確要求 Driver(數據庫驅動)類必須向 DriverManager 註冊本身。以 MySQL 的驅動爲例解釋:咱們看到 Driver 註冊到 DriverManager 中的操做寫在了靜態代碼塊中,這就是爲何在寫 JDBC 時使用 Class.forName() 的緣由了。PS:歡迎在留言區留下你的觀點,一塊兒討論提升。若是今天的文章讓你有新的啓發,歡迎轉發分享給更多人。
版權申明:內容來源網絡,版權歸原創者全部。除非沒法確認,咱們都會標明做者及出處,若有侵權煩請告知,咱們會當即刪除並表示歉意。謝謝!
歡迎加入後端架構師交流羣,在後臺回覆「學習」便可。
最近面試BAT,整理一份面試資料《Java面試BAT通關手冊》,覆蓋了Java核心技術、JVM、Java併發、SSM、微服務、數據庫、數據結構等等。在這裏,我爲你們準備了一份2021年最新最全BAT等大廠Java面試經驗總結。別找了,想獲取史上最簡單的Java大廠面試題學習資料掃下方二維碼回覆「面試」就行了猜你還想看阿里、騰訊、百度、華爲、京東最新面試題聚集超實用!18 個開箱即用的 Shell 腳本,拿好了~
受不了996壓力,某程序員搭建涉黃網站,獲利420萬被抓
升級鴻蒙OS後變卡頓還更耗電?華爲官方解答來了
嘿,你在看嗎?
相關文章
相關標籤/搜索