日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

運(yùn)行時(shí)類型識(shí)別——Class類(動(dòng)態(tài)加載類)

 yliu277 2019-07-23

一、RTTI

RTTI(Run_Time Type Identification 運(yùn)行時(shí)類型識(shí)別):

   RTTI是任何一門面對(duì)對(duì)象語言都必須提供的功能。不僅系統(tǒng)本身要利用該功能來識(shí)別目前正在運(yùn)行的對(duì)象真正所屬的類別,程序員有時(shí)候也需要利用這一機(jī)制來識(shí)別對(duì)象,以設(shè)計(jì)程序作出適當(dāng)?shù)姆磻?yīng)。

   Java在運(yùn)行期間查找對(duì)象和類的信息,主要采取以下兩種形式:

   (1)采用傳統(tǒng)的RTTI,它假定我們已在編譯和運(yùn)行期間擁有所有類型

   (2)采用Java特有的“反射”機(jī)制,利用它可在運(yùn)行期獨(dú)立查找類信息。

說簡(jiǎn)單點(diǎn),Java提供了兩種方式來獲取對(duì)象的信息:一種是利用傳統(tǒng)的方法;一種是利用反射機(jī)制。

二、Class

        Java API中這么解釋Class類:

  Class 類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口, 枚舉是一種類,注釋是一種接口。每個(gè)數(shù)組屬于被映射為 Class 對(duì)象的一個(gè)類,所有具有相同元素類型和維數(shù)的數(shù)組都共享該Class 對(duì)象。 基本的 Java 類型(boolean、byte、char、short、int、longfloatdouble)和關(guān)鍵字 void 也表示為 Class 對(duì)象。

注意:Class 沒有公共構(gòu)造方法。Class 對(duì)象是在加載類時(shí)由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的defineClass 方法自動(dòng)構(gòu)造的

        為了理解RTTI在Java例如何工作,首先必須了解類型信息在運(yùn)行期間是如何表示的。只要用到一個(gè)名為'Class'的特殊形式的對(duì)象,這個(gè)對(duì)象包含了與類有關(guān)的信息(有時(shí)候也把它叫作“元類”)。事實(shí)上,要用Class類創(chuàng)建屬于某個(gè)類的全部“常規(guī)”或“普通”對(duì)象。

       任何一個(gè)作為程序一部分的類,都有一個(gè)Class對(duì)象。換言之,每次寫一個(gè)新類時(shí),同時(shí)也會(huì)創(chuàng)建一個(gè)Class對(duì)象(更恰當(dāng)?shù)恼f,是保存在一個(gè)完全同名的.class文件中)。在運(yùn)行期間,一旦程序員想要生成某一個(gè)類的對(duì)象,用于執(zhí)行程序的Java虛擬機(jī)(JVM)首先就會(huì)檢查該類型的Class對(duì)象是否已經(jīng)載入。若尚未載入,JVM就會(huì)查找同名的.class文件,并將其載入。所以,Java程序啟動(dòng)時(shí)并不是完全載入的,這一點(diǎn)與許多傳統(tǒng)語言不同。一旦該類型的Class對(duì)象進(jìn)入內(nèi)存,就用它創(chuàng)建該類型的所有對(duì)象。

三、Class動(dòng)態(tài)加載類的三種方法

(1)類名.Class

(2)類型.getClass()

(3)Class.forName('類名')  (這里的類名表示具體類名,所以要加上包名)

補(bǔ)充:

靜態(tài)加載類和動(dòng)態(tài)加載類:

        編譯時(shí)刻加載的類是靜態(tài)加載類,例如用new關(guān)鍵字創(chuàng)建的對(duì)象要通過編譯器的靜態(tài)檢查,如果編譯時(shí)該類不存在,那么使用該對(duì)象的類也無法通過編譯。

       運(yùn)行時(shí)刻加載的類是動(dòng)態(tài)類,在編譯的時(shí)候不會(huì)進(jìn)行判斷,只有在運(yùn)行時(shí)才會(huì)進(jìn)行判斷,假設(shè)該類不存在,在運(yùn)行時(shí)才會(huì)報(bào)錯(cuò)。

例如下面的例子:

Candy.java文件

package com.test; public class Candy { static{ System.out.println('Loading Candy in static block'); } public static void main(String[] args){ System.out.println('Loading Candy in main method'); } }

LoadClass.java文件:

package com.test;

public class LoadClass {
	public static void main(String[] args){
		System.out.println('Before loding Candy');
		try {
			//加載Candy對(duì)象
			Class.forName('com.test.Candy');
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
運(yùn)行結(jié)果如下:

Before loding Candy
Loading Candy in static block

從程序的輸出結(jié)果來看,用這種方式和new 來創(chuàng)建對(duì)象沒什么區(qū)別。其實(shí),二者之間有很大的區(qū)別,用new 關(guān)鍵字創(chuàng)建對(duì)象要通過編譯器靜態(tài)檢查,如果編譯時(shí)Candy類不存在,那么使用Candy類對(duì)象的類LoadClass也無法通過編譯。而forName()方法時(shí)動(dòng)態(tài)加載,即便編譯時(shí)Candy類不存在,編譯也是可以通過的,只是在運(yùn)行時(shí)刻會(huì)拋出異常。

注意:使用forName()方法存在一個(gè)問題,它返回的是一個(gè)Class類型,而不是加載的那個(gè)類型。所以,無法做出下面的聲明:

Candy candy=Class.forName('com.test.Candy');
而只能寫為:
Class candy=Class.forName('com.test.Candy');
也就是說,candy無法直接使用Candy類中定義的方法。解決的辦法是利用反射機(jī)制,不過這比直接用new來創(chuàng)建對(duì)象要麻煩得多。所以,用forName()加載對(duì)象多用在加載驅(qū)動(dòng)程序的情況下(例如,加載數(shù)據(jù)庫驅(qū)動(dòng))

下面舉個(gè)例子熟悉一下Class動(dòng)態(tài)加載類的方法:

package com.baseType; public class baseClass { public static void main(String[] args){ Class c1=int.class; //int的類類型 Class c2=String.class; //String類的類類型 Class c3=double.class; //double的類類型 Class c4=Double.class; //Double類的類類型 Class c5=void.class; //關(guān)鍵字void的類類型 //打印類類型的具體名稱 System.out.println(c1.getName()); //int System.out.println(c2.getName()); //java.lang.String System.out.println(c3.getName()); //double System.out.println(c4.getName()); //java.lang.Double System.out.println(c5.getName()); //void //不帶包名的類名稱 System.out.println(c2.getSimpleName()); //String System.out.println(c4.getSimpleName()); //Double } }


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多