一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java進階教程之運行時類型識別RTTI機制

Java進階教程之運行時類型識別RTTI機制

2019-11-27 15:11junjie JAVA教程

這篇文章主要介紹了Java進階教程之運行時類型識別RTTI機制,在Java運行時,RTTI維護類的相關信息,比如多態(polymorphism)就是基于RTTI實現的,需要的朋友可以參考下

運行時類型識別(RTTI, Run-Time Type Identification)是Java中非常有用的機制,在Java運行時,RTTI維護類的相關信息。

多態(polymorphism)是基于RTTI實現的。RTTI的功能主要是由Class類實現的。

Class類

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

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

 

復制代碼代碼如下:


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

}

 

當我們調用對象的getClass()方法時,就得到對應Class對象的引用。

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

Java中每個對象都有相應的Class類對象,因此,我們隨時能通過Class對象知道某個對象“真正”所屬的類。無論我們對引用進行怎樣的類型轉換,對象本身所對應的Class對象都是同一個。當我們通過某個引用調用方法時,Java總能找到正確的Class類中所定義的方法,并執行該Class類中的代碼。由于Class對象的存在,Java不會因為類型的向上轉換而迷失。這就是多態的原理。

Java進階教程之運行時類型識別RTTI機制

getClass: 我是誰?

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

 

復制代碼代碼如下:


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()方法接收一個字符串作為參數,該字符串是類的名字。這將返回相應的Class類對象。

2.Woman.class方法是直接調用類的class成員。這將返回相應的Class類對象。

Class類的方法

Class對象記錄了相應類的信息,比如類的名字,類所在的包等等。我們可以調用相應的方法,比如:

復制代碼代碼如下:

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

 

可以利用Class對象的newInstance()方法來創建相應類的對象,比如:

復制代碼代碼如下:

Human newPerson = c1.newInstance();  


newInstance()調用默認的不含參數的構建方法。

 

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

復制代碼代碼如下:

getFields()       返回所有的public數據成員
getMethods()      返回所有的public方法


可以進一步使用Reflection分析類。這里不再深入。

 

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

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

Class類的加載

當Java創建某個類的對象,比如Human類對象時,Java會檢查內存中是否有相應的Class對象。

如果內存中沒有相應的Class對象,那么Java會在.class文件中尋找Human類的定義,并加載Human類的Class對象。

在Class對象加載成功后,其他Human對象的創建和相關操作都將參照該Class對象。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 韩国三级年轻的小婊孑 | 精品国产一区二区三区久久久蜜臀 | 农夫69小说小雨与农村老太 | 男人操女人免费视频 | 免费一看一级毛片人 | 糖心vlog网页版 | 亚洲精品午夜视频 | 亚洲国产精品第一页 | 午夜影院免费观看视频 | 太粗 好紧 使劲舒服 | chinese男gay飞机同志 | 污书屋 | 6080伦理久久精品亚洲 | 手机看片国产自拍 | 波多野结衣xxxxx在线播放 | 国产精品xxxav免费视频 | 亚洲欧美优优色在线影院 | 精品在线99 | 精品在线免费播放 | 成年男女免费视频网站 | 双性鞭蒂软汁淋漓 | 日日操视频 | 国内精品中文字幕 | 成年人免费观看的视频 | 国产日韩成人 | 国产精品久久久久久 | 精品在线播放视频 | 明星h文集合短篇小说 | www.天天操 | 国产91青青成人a在线 | 调教老师肉色丝袜的故事 | 青青青手机视频 | 国产午夜久久精品 | 妇乱子伦激情 | 艹艹逼| 娇妻被朋友征服中文字幕 | 99年水嫩漂亮粉嫩在线播放 | 免费看片aⅴ免费大片 | 涩情主播在线翻车 | 国产成人精品视频频 | 深夜精品高中女学生 |