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