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)實例,必須用反射