运行时类型识别RTTI

1.RTTI的工作原理

例1. 用Class加载对象示例。

package RTTI;

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.");

    }

}
package RTTI;

public class loadClass {

    public static void main(String[] args) {
        System.out.println("Before loading Candy.");
        try {
            Class.forName("Candy");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

2. 使用getClass()方法获取类信息

例2. getClass()方法使用示例。

package RTTI;

public class Shape {
    void showMsg(){
        System.out.println("This is Shape class.");
    }
}
package RTTI;

public class Circle extends Shape {
    void showMsg(){
        System.out.println("This is Circle class.");
    }
}
package RTTI;

public class getClassName {

    public static void showName(Shape shape){
        Class c1 = shape.getClass();
        System.out.println(c1.getName());
        if(c1.getName().equals("RTTI.Shape"))
            System.out.println("This is a shape object.");
        else if(c1.getName().equals("RTTI.Circle"))
            System.out.println("This is a circle object.");
    }
    public static void main(String[] args) {
        showName(new Circle());
        showName(new Shape());

    }

}

程序的输出结果为:

RTTI.Circle
This is a circle object.
RTTI.Shape
This is a shape object.

3. 使用类标记

java提供了一种简便生成Class对象的方法:类标记。如果T是任意的java类型,那么,T.class就代表匹配的类对象。例如:

Class c1 = int.class;
Class c2 = double[].class;
Class c3 = Shape.class;

例3. 类标记使用示例

package RTTI;

public class getClassName {

    public static void showName(Shape shape){
        Class c1 = shape.getClass();
        System.out.println(c1.getName());
//        if(c1.getName().equals("RTTI.Shape"))
        if(c1==Shape.class)
            System.out.println("This is a shape object.");
//        else if(c1.getName().equals("RTTI.Circle"))
        else if(c1==Circle.class)
            System.out.println("This is a circle object.");
    }
    public static void main(String[] args) {
        showName(new Circle());
        showName(new Shape());

    }

}

4. 使用关键字instanceof判断所属类

java提供了一个关键字instanceof,用于帮助程序员判断一个对象真正所属的类。它是一个二元运算符,一般形式如下:

objectName instanceof className

计算结果为true或false。

例4. 使用instanceof判断所属类。

package RTTI;

public class getClassName {

    public static void showName(Shape shape){
        Class c1 = shape.getClass();
        System.out.println(c1.getName());
//        if(c1.getName().equals("RTTI.Shape"))
//        if(c1==Shape.class)
        if(shape instanceof Circle)
            System.out.println("This is a circle object.");
//        else if(c1.getName().equals("RTTI.Circle"))
//        else if(c1==Circle.class)
        else if(shape instanceof Shape)
            System.out.println("This is a shape object.");
    }
    public static void main(String[] args) {
        showName(new Circle());
        showName(new Shape());

    }

}
时间: 2024-12-29 11:59:43

运行时类型识别RTTI的相关文章

C++运行时类型识别——RTTI

RTTI 通过运行时类型识别--RTTI,程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类类型: 其主要通过两个操作符来实现: 1.typeid--返回指针或引用所指对象的实际类型: 2.dynamic_cast--将基类类型的指针或引用安全地转换为派生类型的指针或引用: dynamic_cast 当无法为基类增加虚函数,又要使用基类的指针或引用调用派生类的函数时,可以使用该操作符代替虚函数. 与dynamic_cast一起使用的指针必须是有效的--它必须为0或者指向一个对象

MFC中的运行时类型识别(RTTI)

RTTI是Runtime Type Identification的缩写,中文名为"运行时类型识别". MFC早在编译器支持RTTI之前,就有了这种能力.我们现在要以相同的手法,在Console程序中仿真出来.我希望我的类库具备IsKindOf 的能力,能在执行期侦测到某个对象是否属于某个类,并传回TRUE 或 FALSE.以形状 Shape为例 ,我希望: 即 长方形属于"长方形类",正方形属于"长方形类",圆不属于"长方形类"

C++学习之显示类型转换与运行时类型识别RTTI

static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情况一样? 什么情况下使用dynamic_cast代替虚函数? typeid 命名的强制类型转换形式如下: cast_name<type>(expression); 其中:cast_name指static_cast.dynamic_cast.const_cast.reinterpret_cast中的

Java基础之RTTI 运行时类型识别

运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于RTTI实现的.RTTI的功能主要是由Class类实现的. Class类 Class类是"类的类"(class of classes).如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合. 每一个Class类的对象代表一个其他的类.比如下面的程序中,Class类的对象c1代

运行时类型识别

1.RTTI 1)运行时类型识别RTTI(Run-Time Type Identification),它能够获取基类指针或引用所指向的对象的实际类型,在C++中,为了支持RTTI提供了两个运算符:typeid和dynamic_cast 2) 2.dynamic_cast 2.1概念 1)dynamic_cast运算符用于将基类的指针或引用安全地转换成派生类的指针或引用,这是安全的“向下转型”,至于“向上转型”,即派生类指针或引用转换为其基类指针或引用,本身就是安全的,尽管可以使用dynamic_

RTTI 运行时类型识别

RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3.转换成功返回的是子类的地址,失败返回NULL typeid注意事项: 1.typeid返回一个type_info对象的引用 2.如果想通过基类获得派生类的数据类型,基类必须带有虚函数 3.只能获取对象的实际类型

C++杂记:运行时类型识别(RTTI)与动态类型转换原理

运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert> struct B {} b, c; struct D : B {

MFC 六大机制 (2) RTTI(运行时类型识别)

RTTI(Runtime Type Identification,运行时类型识别) 程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.MFC 早在编译器支持 RTTI 之前,就具有了这项能力.承接上一章,我们现在要在 Console 程序中将 RTTI 仿真出来.我希望我的类库具备 IsKindOf() 的能力,能够在执行器检查某个对象是否"属于某种类",并传回 TRUE 或 FALSE.为了更直观地查看结果,我在 IsKindOf() 中加入了输出,使其达到如

【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

原文:C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理 运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. 静态类型的情形 C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是const std::type_info&,例: #include <typeinfo> #include <cassert>