運(yùn)行時(shí)類型識(shí)別(RTTI, Run-Time Type Information)是Java中非常有用的機(jī)制,在java中,有兩種RTTI的方式,一種是傳統(tǒng)的,即假設(shè)在編譯時(shí)已經(jīng)知道了所有的類型;還有一種,是利用反射機(jī)制,在運(yùn)行時(shí)再嘗試確定類型信息。
本篇博文會(huì)結(jié)合Thinking in Java 的demo 和實(shí)際開發(fā)中碰到的例子,對(duì)Java反射和獲取類型信息做總體上整理。文章主要分為三塊:
Java類加載和初始化
Java中RTTI
Java利用反射獲取運(yùn)行時(shí)類型信息
一:Java類加載和初始化
在學(xué)習(xí)RTTI的時(shí)候,首先需要知道Java中類是如何加載的,java又是如何根據(jù)這些class文件得到JVM中需要的信息(備注:我在此處實(shí)在是想不到更好的描述,望讀者可以給出更好的描述)
1.1 類加載器(類加載的工具)
類加載器子系統(tǒng)包含一條加載器鏈,只有一個(gè)“原生的類加載器”他是jvm實(shí)現(xiàn)的一部分,可以用來(lái)記載本地jar包內(nèi)的class,若涉及加載網(wǎng)絡(luò)上的類,或者是web服務(wù)器應(yīng)用,可以掛接額外的類加載器。
1.2 Java使用一個(gè)類所需的準(zhǔn)備工作
1.2.1 動(dòng)態(tài)加載
所有的類都是第一次使用的時(shí)候,動(dòng)態(tài)加載到JVM中。創(chuàng)建對(duì)類的靜態(tài)成員的引用,加載這個(gè)類。Java程序在開始運(yùn)行的時(shí)候并非完全加載,類都是用的地方在加載,這就是動(dòng)態(tài)加載
?、伲菏紫葯z查這個(gè)類是否被加載
②:如果沒有加載,再去根據(jù)類名查找.class文件,加載類的字節(jié)碼,并校驗(yàn)是否存在不良代碼,
測(cè)試代碼如下:
//candy.javapublic class Candy { static { System.out.println("loading Candy"); } }//co