国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

RTTI簡(jiǎn)述

2019-11-11 00:17:49
字體:
供稿:網(wǎng)友

運(yùn)行時(shí)類型識(shí)別(RTTI, Run-Time Type Identification)是java中非常有用的機(jī)制,在Java運(yùn)行時(shí),RTTI維護(hù)類的相關(guān)信息。

多態(tài)(polymorphism)是基于RTTI實(shí)現(xiàn)的。RTTI的功能主要是由Class類實(shí)現(xiàn)的。

        publicfinal class Class<T> implements java.io.Serializable,                              GenericDeclaration,                              Type,                              AnnotatedElement {}

Class類

Class類是"類的類"(class of classes)。如果說類是對(duì)象的抽象和集合的話,那么Class類就是對(duì)類的抽象和集合。

每一個(gè)Class類的對(duì)象代表一個(gè)其他的類。比如下面的程序中,Class類的對(duì)象c1代表了Human類,c2代表了Woman類。

復(fù)制代碼
public class Test{    public static void main(String[] args)    {        Human aPerson = new Human();        Class c1      = aPerson.getClass();        System.out.PRintln(c1.getName());
        Human anotherPerson = new Woman();        Class c2      = anotherPerson.getClass();        System.out.println(c2.getName());      }}class Human{        /**     * accessor     */    public int getHeight()    {       return this.height;    }    /**     * mutator     */    public void growHeight(int h)    {        this.height = this.height + h;    }private int height; }class Woman extends Human{    /**     * new method     */    public Human giveBirth()    {        System.out.println("Give birth");        return (new Human());    }}復(fù)制代碼

當(dāng)我們調(diào)用對(duì)象的getClass()方法時(shí),就得到對(duì)應(yīng)Class對(duì)象的引用。

在c2中,即使我們將Women對(duì)象的引用向上轉(zhuǎn)換為Human對(duì)象的引用,對(duì)象所指向的Class類對(duì)象依然是Woman。

Java中每個(gè)對(duì)象都有相應(yīng)的Class類對(duì)象,因此,我們隨時(shí)能通過Class對(duì)象知道某個(gè)對(duì)象“真正”所屬的類。無論我們對(duì)引用進(jìn)行怎樣的類型轉(zhuǎn)換,對(duì)象本身所對(duì)應(yīng)的Class對(duì)象都是同一個(gè)。當(dāng)我們通過某個(gè)引用調(diào)用方法時(shí),Java總能找到正確的Class類中所定義的方法,并執(zhí)行該Class類中的代碼。由于Class對(duì)象的存在,Java不會(huì)因?yàn)轭愋偷南蛏限D(zhuǎn)換而迷失。這就是多態(tài)的原理。

除了getClass()方法外,我們還有其他方式調(diào)用Class類的對(duì)象。

復(fù)制代碼
public class Test{    public static void main(String[] args)    {        Class c3      = Class.forName("Human");        System.out.println(c1.getName());        Class c4      = Woman.class        System.out.println(c2.getName());      }}復(fù)制代碼

上面顯示了兩種方式:

forName()方法接收一個(gè)字符串作為參數(shù),該字符串是類的名字。這將返回相應(yīng)的Class類對(duì)象。Woman.class方法是直接調(diào)用類的class成員。這將返回相應(yīng)的Class類對(duì)象。

 

Class類的方法

Class對(duì)象記錄了相應(yīng)類的信息,比如類的名字,類所在的包等等。我們可以調(diào)用相應(yīng)的方法,比如:

getName()         返回類的名字

getPackage()      返回類所在的包

 

可以利用Class對(duì)象的newInstance()方法來創(chuàng)建相應(yīng)類的對(duì)象,比如:

Human newPerson = c1.newInstance();  

newInstance()調(diào)用默認(rèn)的不含參數(shù)的構(gòu)建方法。

 

我們可以獲得類定義的成員:

getFields()       返回所有的public數(shù)據(jù)成員

getMethods()      返回所有的public方法

可以進(jìn)一步使用Reflection分析類。這里不再深入。

 

Class類更多的方法可查詢官方文檔:

http://docs.Oracle.com/javase/1.5.0/docs/api/java/lang/Class.html

 

Class類的加載

當(dāng)Java創(chuàng)建某個(gè)類的對(duì)象,比如Human類對(duì)象時(shí),Java會(huì)檢查內(nèi)存中是否有相應(yīng)的Class對(duì)象。

如果內(nèi)存中沒有相應(yīng)的Class對(duì)象,那么Java會(huì)在.class文件中尋找Human類的定義,并加載Human類的Class對(duì)象。

在Class對(duì)象加載成功后,其他Human對(duì)象的創(chuàng)建和相關(guān)操作都將參照該Class對(duì)象。

出處:http://www.cnblogs.com/vamei 歡迎轉(zhuǎn)載


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 双辽市| 保康县| 环江| 大同市| 内江市| 东乌珠穆沁旗| 绥中县| 攀枝花市| 辽宁省| 兴城市| 桦川县| 平度市| 金门县| 哈尔滨市| 沁水县| 柞水县| 汉川市| 嘉义县| 泸定县| 林周县| 石林| 阿尔山市| 宁都县| 天等县| 昌宁县| 前郭尔| 繁昌县| 彭州市| 达州市| 本溪| 鄄城县| 富阳市| 三原县| 连平县| 铜陵市| 平度市| 崇阳县| 乌苏市| 余姚市| 壶关县| 乌苏市|