Class.forName的理解

Class.forName返回的結果是一個類,它的作用是要求JVM查找並加載指定的類,
也就是說jvm會執行這個類裏面的靜態代碼段(靜態代碼只在class加載的時候執行一次)。
並且當我們是用Class.forName(XX)的時候,XX並沒有初始化,只是將XX的字節碼讀入到內存中了(只是動態的加載了XX對象),
只有我們調用了newInstance()的時候,它纔會去初始化XX這個類。


A a = (A)Class.forName("package.A").newInstance();
A a = new A();
這兩種方式都是實例化A,並且他們得到的效果是一樣的.
那它們有什麼區別呢?
new是關鍵字,newInstance()是一個方法.他們的區別創建對象的方式不一樣,new僅僅是創建一個新類,並且它在使用的時候,
我們對A是已知的。而newInstance()採用的類加載機制,我們在使用的時候對A的情況是未知的(工廠模式)。
newInstance:弱類型,只能調用無參構造函數
new:強類型,可以調用無參構造函數也可以調用有參構造函數


什麼叫反射:
反射指的是程序在運行時能夠獲取自身的信息.也就是隻要我們給定類的名字,那麼我們就可以通過反射機制來獲得類的所有信息.
優點:
動態創建和編譯對象


我們都知道是用一個類需要通過加裝,鏈接和初始化這三個操作。
1.加裝:由類加載器查找字節碼,並將這些字節碼創建一個Class對象
2.鏈接:驗證類中的字節碼,爲靜態域分配存儲空間
3:初始化:執行靜態初始化器和靜態初始化塊


類的初始化時機
1:創建類的實例
2:訪問類或接口的靜態變量
3:調用類的靜態方法
4:反射
5:初始化類的子類(調用子類的靜態變量,方法)
6:java虛擬機啓動時被標明爲啓動類的類


加載順序:
父類靜態成員、靜態代碼塊——>子類靜態成員、靜態代碼塊——>父類實例成員、代碼塊——>父類構造函數—>子類實例成員、代碼塊——>子類構造函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章