20170718 類加載機制與反射

JVM和類

系統(tǒng)出現(xiàn)以下情形,JVM進程將終止

1、程序運行到最后正常結(jié)束

2、使用System.exit()或Runtime.getRuntime().exit()

3、遇到未捕捉的異?;蝈e誤而結(jié)束

4、所在平臺強制結(jié)束了JVM進程


類的加載:將class文件讀入內(nèi)存

當(dāng)程序主動使用某個類時,若類仍未加載到內(nèi)存中,則系統(tǒng)會通過加載、連接、初始化對該類初始化

若無意外,JVM連續(xù)完成三步驟

JVM提供類加載器,類加載器加載類


加載類的本源

1、本地文件系統(tǒng)加載class文件(大多數(shù))

2、從JAR包加載class文件

3、網(wǎng)絡(luò)加載class文件

4、把一個Java源文件動態(tài)編譯執(zhí)行加載


類的連接

1、驗證

2、準(zhǔn)備:

為類變量負責(zé)內(nèi)存

并設(shè)置默認(rèn)初始值

3、解析
將類的二進制數(shù)據(jù)中的符號引用替換成直接引用


類的初始化

1、優(yōu)先加載并連接

2、先初始化父類

3、優(yōu)先執(zhí)行初始化語句


初始化時機

1、創(chuàng)建類的實例

2、調(diào)用某個類的方法

3、訪問某個類或接口的類變量

4、使用反射方式強制創(chuàng)建某個類或接口對應(yīng)的java.lang.class對象

5、初始化某個類的子類

6、java.exc運行某個主類


ClassLoader加載器類

loadClass()加載

forName()強制初始化


類加載器層次結(jié)構(gòu):

根類加載器:非ClassLoader子類,由JVM自身實現(xiàn)

擴展類加載器

系統(tǒng)類加載器

類加載機制

全盤托出:

一個類加載器加載某個類時,該類所依賴和引用的其他Class也由該類加載器加載


父類委托

緩存機制

已夾在過的CLass會翻入緩存

使用某類時,檢索緩存區(qū)NOT EXIST 加載

URLClassLoader

系統(tǒng)類加載器與擴展類加載器父類


通過反射查看類信息

獲得Class對象三種方式1、forName()

2、類名.class

3、對象名。getclass()


通過反射生成對象的方式:

1、使用Class對象的newInstance()方法來創(chuàng)建該Class對象對應(yīng)類實例

要求:有默認(rèn)構(gòu)造器

2、使用Class對象獲取指定Constructor對象

再調(diào)用Constructor對象的newInstance()

來創(chuàng)建該Class對象類的實例


第一類比較常見

因為在很多JavaEE框架中都需要根據(jù)配置文件來創(chuàng)建Java對象,從配置文件讀取的只是某個類的字符串類名,程序需要根據(jù)該字符串來創(chuàng)建對應(yīng)實例,必須用反射

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容