这一章节我们来讨论一下为什么需要RTTI(Run-Time Type Identification)。
答案:RTTI维护类型的信息,为多态机制的实现提供基础。
1.怎么为多态的实现提供基础?
多态,主要就是通过向上转型,然后通过泛化来父类引用子类对象。
例如:
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
Person man = new Man();
man.say();
}
}
class Person {
public void say() {
System.out.println("i am a person");
}
}
class Man extends Person {
@Override
public void say() {
System.out.println("i am a man");
}
}
输出:
i am a man
通过继承,我们Man覆盖say方法,但是我们在new的时候写的类型是Person,通过RTTI它知道了需要调用Man的say方法,所以才有上面的输出。
我们举例来说明上面的描述:
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.getClass().getName());
Person man = new Man();
System.out.println(man.getClass().getName());
}
}
class Person {
}
class Man extends Person {
}
输出:
com.ray.ch12.Person
com.ray.ch12.Man
我们通过getClass的getName方法,得到这个变量具体指向哪个类new出来的对象,虽然大家new的时候都是创建Person类型的对象,但是通过输出看见,其实上面两个变量是指向不同类生成的对象的,因此,对于第一段代码里面为什么能够输出“i am a man”,就是因为通过RTTI编译器知道调用哪个对象的方法。
2.RTTI提供一些什么信息?
关于这一点我们可以查看api里面Class这一个类的一些方法,它里面有详细描述。
我们下面将举一个比较常用的方法:forName
我们下面在同一个包里面建立两个类:
Bird:
package com.ray.ch12;
public class Bird {
}
Test:
package com.ray.ch12;
public class Test {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
try {
Class<Bird> birdClass = (Class<Bird>) Class.forName("com.ray.ch12.Bird");
Bird bird = (Bird) birdClass.newInstance();
System.out.println(bird.getClass().getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
com.ray.ch12.Bird
RTTI还给我提供了丰富的类型信息,在运行当中我们可以适当的运用。
总结:这一章章节介绍了为什么需要RTTI,以及介绍了我们比较常用的forName方法。
这一章节就到这里,谢谢。
-----------------------------------
目录
分享到:
相关推荐
RTTI(Run-Time Type Information),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
通过运行时类型识别(RTTI)(Run-Time Type Identification),程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
typeid关键字 注意:typeid是操作符,不是函数。这点与sizeof类似) ...RTTI(Run-Time Type Identification)-运行时类型识别 在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identificatio
DELPHI RTTI 探索 RTTI(Run-Time Type Information) 翻译过来的名称是“运行期类型信息”,也就是说可以在运行期获得数据类型或类(class)的信息。
失物招领平台源码java C++ 到 Java 的翻译器 该项目旨在将 C++ 代码转换为高级 Java 源代码。 在不可能的情况下,TODO 应该出现在生成的源代码中。 地位 该项目大约进行了四分之三的初始发布。 以下项目将不会被初始...
通过delphi的RTTI机制建立类的方法建立rttiinspector属性编辑框,从而自己随心使用
如果想了解RTTI的内部实现,这本书一定会满足你,这是一本详细阐述RTTI机制实现的一本书
在C++中如果使用多态继承类,对于多态性的对象,在程序编译时可能会出现无法确定对象的类型的情况,这事就需要通过RTTI动态识别对象的类型。因此,本文探讨了RTTI的使用细节。同时,由于有些平台C++编译器(如...
Delphi-的RTTI机制浅探.doc
主要介绍了Java进阶教程之运行时类型识别RTTI机制,在Java运行时,RTTI维护类的相关信息,比如多态(polymorphism)就是基于RTTI实现的,需要的朋友可以参考下
主要介绍了Java的RTTI运行时类型识别机制,包括泛化的Class引用以及类型检查instanceof等知识点,需要的朋友可以参考下
Delphi的RTTI机制文档
JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm ------------------------------------------------- 本教程由yyc,spirit整理 ------------------------------------------------- “Thinking in Java...
CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" cmake . -LH|more //CMake下查看MySQL的编译配置 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DEXTRA_CHARSETS=all make make ...
主要涉及了Java的RTTI和反射机制代码分析的相关内容,在介绍运行时类型识别的同时,又向大家展示了其实例以及什么时候会用到反射机制,内容丰富,需要的朋友可以参考下。
MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 RTTI.02MFC源代码 ...
个人收集的RTTI机制....好的话就顶
c++ RTTI深度解析, 运行时类型识别技术
delphi RTTI功能示例 演示如何在delphi 中使用rtti