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虛擬機啓動時被標明爲啓動類的類
加載順序:
父類靜態成員、靜態代碼塊——>子類靜態成員、靜態代碼塊——>父類實例成員、代碼塊——>父類構造函數—>子類實例成員、代碼塊——>子類構造函數
Class.forName的理解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
FileWriter,BufferedWriter如何輸出換行?
breath_zfx
2018-08-27 16:23:49
Object和Condition對應的操作線程方法
米糕思密达
2018-08-27 11:51:42
JAVA-POI-讀取excel文件
半笙彷徨
2018-08-26 19:28:45
JAVA-Apache-POI-java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell
半笙彷徨
2018-08-26 19:28:42
JAVA-Stream-List轉換Map
半笙彷徨
2018-08-26 19:28:34
JAVA-替換字符串非數字字符
半笙彷徨
2018-08-26 19:28:34
JAVA-根據文件名排序
半笙彷徨
2018-08-26 19:28:32
候捷談Java反射機制
wen31
2018-08-26 17:08:23
深入理解嵌套類和內部類
wen31
2018-08-26 17:08:20
JNDI---Naming Package
wen31
2018-08-26 17:08:20
學習java的30個目標
wen31
2018-08-26 17:08:19
java關於main的參數的問題
wen31
2018-08-26 17:08:18
head first java 閱讀筆記
拾光之路
2018-08-26 04:22:41
一個簡單的九宮格計算器
a85907468
2018-08-26 00:43:31