最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java進(jìn)階教程之運(yùn)行時(shí)類型識(shí)別RTTI機(jī)制

 更新時(shí)間:2014年09月01日 13:12:54   投稿:junjie  
這篇文章主要介紹了Java進(jìn)階教程之運(yùn)行時(shí)類型識(shí)別RTTI機(jī)制,在Java運(yùn)行時(shí),RTTI維護(hù)類的相關(guān)信息,比如多態(tài)(polymorphism)就是基于RTTI實(shí)現(xiàn)的,需要的朋友可以參考下

運(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)的。

Class類

Class類是"類的類"(class of classes)。如果說(shuō)類是對(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());
    }

}

當(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ì)象“真正”所屬的類。無(wú)論我們對(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: 我是誰(shuí)?

除了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()); 
    }
}

上面顯示了兩種方式:

1.forName()方法接收一個(gè)字符串作為參數(shù),該字符串是類的名字。這將返回相應(yīng)的Class類對(duì)象。

2.Woman.class方法是直接調(diào)用類的class成員。這將返回相應(yīng)的Class類對(duì)象。

Class類的方法

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

復(fù)制代碼 代碼如下:

getName()         返回類的名字
getPackage()      返回類所在的包

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

復(fù)制代碼 代碼如下:

Human newPerson = c1.newInstance(); 

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

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

復(fù)制代碼 代碼如下:

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ì)象。

相關(guān)文章

  • JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解

    JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解

    這篇文章主要介紹了JavaWeb中的文件上傳和下載功能的實(shí)現(xiàn),在開發(fā)中,文件上傳和下載功能是非常常用的功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Mybatis-plus分頁(yè)查詢不生效問題排查全過程

    Mybatis-plus分頁(yè)查詢不生效問題排查全過程

    最近寫分頁(yè)的時(shí)候,遇到了分頁(yè)無(wú)法正常發(fā)揮作用的問題,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus分頁(yè)查詢不生效問題排查的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • SpringBoot使用CommandLineRunner和ApplicationRunner執(zhí)行初始化業(yè)務(wù)方式

    SpringBoot使用CommandLineRunner和ApplicationRunner執(zhí)行初始化業(yè)務(wù)方式

    這篇文章主要介紹了SpringBoot使用CommandLineRunner和ApplicationRunner執(zhí)行初始化業(yè)務(wù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀

    AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀

    這篇文章主要為大家介紹了AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Logger.error打印錯(cuò)誤異常的詳細(xì)堆棧信息

    Logger.error打印錯(cuò)誤異常的詳細(xì)堆棧信息

    這篇文章主要介紹了Logger.error打印錯(cuò)誤異常的詳細(xì)堆棧信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Spring Boot2.x集成JPA快速開發(fā)的示例代碼

    Spring Boot2.x集成JPA快速開發(fā)的示例代碼

    這篇文章主要介紹了Spring Boot2.x集成JPA快速開發(fā),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • java日志打印的完全使用指南

    java日志打印的完全使用指南

    日志就是記錄程序的運(yùn)行軌跡,方便查找關(guān)鍵信息,也方便快速定位解決問題,下面這篇文章主要給大家介紹了關(guān)于java日志打印使用的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • SpringBoot對(duì)Filter過濾器中的異常進(jìn)行全局處理方案詳解

    SpringBoot對(duì)Filter過濾器中的異常進(jìn)行全局處理方案詳解

    這篇文章主要介紹了SpringBoot對(duì)Filter過濾器中的異常進(jìn)行全局處理,在SpringBoot中我們通過 @ControllerAdvice 注解和 @ExceptionHandler注解注冊(cè)了全局異常處理器,需要的朋友可以參考下
    2023-09-09
  • Spring?Bean獲取方式的實(shí)例化方式詳解

    Spring?Bean獲取方式的實(shí)例化方式詳解

    工作中需要對(duì)一個(gè)原本加載屬性文件的工具類修改成對(duì)數(shù)據(jù)庫(kù)的操作當(dāng)然,ado層已經(jīng)寫好,但是需要從Spring中獲取bean,然而,工具類并沒有交給Spring來(lái)管理,所以需要通過方法獲取所需要的bean。于是整理了Spring獲取bean的幾種方法
    2023-03-03
  • Java數(shù)組越界問題實(shí)例解析

    Java數(shù)組越界問題實(shí)例解析

    這篇文章主要介紹了Java數(shù)組越界問題實(shí)例解析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10

最新評(píng)論

永春县| 壤塘县| 佛冈县| 平凉市| 鄂伦春自治旗| 北海市| 仁布县| 昭苏县| 藁城市| 巴林左旗| 隆昌县| 营山县| 广饶县| 峡江县| 济阳县| 仁化县| 晴隆县| 夏邑县| 临海市| 葫芦岛市| 安泽县| 丹巴县| 阜阳市| 义马市| 梨树县| 镇巴县| 驻马店市| 淳安县| 禹州市| 辽宁省| 浦北县| 阿克苏市| 兴安县| 林西县| 东兰县| 宿迁市| 社旗县| 松潘县| 永宁县| 上杭县| 类乌齐县|