RTTI可以帮助我们在运行时识别对象和类的信息。

一般传统的RTTI有三种实现方式:

1. 向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子类)需要强制类型转换
2. Class对象(用了Class对象,不代表就是反射,如果只是用Class对象cast成指定的类,那就还是传统的RTTI)
3. instanceof或isInstance()

通过Class对象实现RTTI

interface HasBatteries{}
interface Waterproof{}
interface Shoots{} class Toy{
Toy() {}
Toy(int i) {}
}
class FancyToy extends Toy implements HasBatteries, Waterproof, Shoots {
public FancyToy() {
super(1);
}
} public class ToyTest { public static void printInfo(Class c) {
System.out.println("Class name: " + c.getName() + "\n"
+ "is interface: " + c.isInterface() + "\n"
+ "Simple name: " + c.getSimpleName() + "\n"
+ "Cannonical name: " + c.getCanonicalName()
);
}
public static void main(String[] args) {
Class c = null;
try {
c = Class.forName("FancyToy"); //通过Class提供的forName方法得到FancyToy的Class对象
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("FancyToy类的基本信息:");
printInfo(c);
System.out.println("FancyToy实现的接口的信息:");
for (Class interf : c.getInterfaces()) {
printInfo(interf);
} Class up = c.getSuperclass();
System.out.println("FancyToy的父类的信息:");
printInfo(up);
Toy toy = null;
try {
toy = (Toy)up.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
printInfo(Toy.class); //通过类字面值常量获得Class对象
} } 输出:
FancyToy类的基本信息:
Class name: FancyToy
is interface: false
Simple name: FancyToy
Cannonical name: FancyToy
FancyToy实现的接口的信息:
Class name: HasBatteries
is interface: true
Simple name: HasBatteries
Cannonical name: HasBatteries
Class name: Waterproof
is interface: true
Simple name: Waterproof
Cannonical name: Waterproof
Class name: Shoots
is interface: true
Simple name: Shoots
Cannonical name: Shoots
FancyToy的父类的信息:
Class name: Toy
is interface: false
Simple name: Toy
Cannonical name: Toy
Class name: Toy
is interface: false
Simple name: Toy
Cannonical name: Toy

  

Class还有泛化的,例如: Class<? extends Base>表示所有继承自Base的类的Class对象。

instanceof /Class.isInstance

class Base{}
class Derived extends Base{} public class ToyTest {
public static void test(Object x) {
/*
* instanceof /Class.isInstance 表示左边的是右边的这个类吗?或者是右边这个类的派生类吗?
* == 或者 equal 比较的是确切的类型
*/
System.out.println("Testing x of type : " + x.getClass());
System.out.println("x instance of Base : " + (x instanceof Base));
System.out.println("x instanceof Derived : " + (x instanceof Derived));
System.out.println("Base.isInstance : " + Base.class.isInstance(x));
System.out.println("Derived.isInstance : " + Derived.class.isInstance(x));
System.out.println("x.getClass() == Base.class" + (x.getClass() == Base.class));
System.out.println("x.getClass() == Derived.class" + (x.getClass() == Derived.class));
System.out.println("x.getClass().equals(Base.class)" + (x.getClass().equals(Base.class)));
System.out.println("x.getClass().equals(Derived.class)" + (x.getClass().equals(Derived.class)));
} public static void main(String[] args) {
test(new Base());
test(new Derived());
}
}

  

参考: 《Java编程思想》14章

Java中的RTTI的更多相关文章

  1. C++中的RTTI机制解析

    RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...

  2. Java进阶04 RTTI

    链接地址:http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html 作者:Vamei 出处:http://www.cnblogs.com ...

  3. delpi中的RTTI初试

    java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo: 1.先定义一 ...

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

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  5. Java中Class类详解、用法及泛化

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...

  6. Java中Class类及用法

    Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...

  7. java中一些常用的英语

     abstract (关键字  ) 抽象  ['.bstr.kt]  access vt.访问,存取  ['.kses]'(n.入口,使用权)  algorithm n.算法  ['.lg.rie ...

  8. JAVA中的类

    节选自:http://www.cnblogs.com/dolphin0520/p/3811445.html 1. 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一 ...

  9. Thinking in Java -- 类型信息RTTI

    Thinking in Java – 类型信息 个人感觉 java 中的比較难的部分了,在看了些netty源代码发现事实上这块很实用. 这章重点是RTTI和反射.先说下自己的理解 RTTI是执行时识别 ...

随机推荐

  1. pyrhon3与mysql:查、更、删49

    import pymysql conn = pymysql.connect(host=',db='jodb1',port=3307,charset='utf8') # 172.31.10.225 # ...

  2. c#实现图片二值化例子(黑白效果)

    C#将图片2值化示例代码,原图及二值化后的图片如下: 原图: 二值化后的图像: 实现代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  3. EXTJS 4.2.1.883 Summary 合计栏宽度bug

    EXTJS 4.2.1.883中改进了summary插件,使合计栏能够在grid最底部显示,但是列宽和表格对不上,解决方法: 找到以下样式 .x-docked-summary .x-grid-tabl ...

  4. Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现

    http://blog.sciencenet.cn/blog-95484-803140.html % %图像灰度变换 % f = imread('E:\2013第一学期课程\媒体计算\实验一\Img\ ...

  5. OO第四次阶段性总结

    测试与正确性论证的效果差异及优缺点 测试实际上就是对程序进行的一种黑箱测试,利用各种各样的测试样例去检验程序是否能够给出正确的结果.其中的单元测试则是将整体的测试拆分成单元来进行,但其仍然躲不开黑箱测 ...

  6. A+B+C问题

    这是一个非常简单的题目,意在考察你编程的基础能力.千万别想难了哦.输入为一行,包括了用空格分隔的三个整数 AA.BB.CC(数据范围均在-40−40 ~ 4040 之间).输出为一行,为“A+B+CA ...

  7. 2:5 视图控制器result的配置

    result:   1:其实底层还是使用原来servlet的转发和重定向的方法: 2:redirectAction:只能定位到 action (比如下面name属性为 *User 的Action ,但 ...

  8. 【百度统计】设置页面元素点击事件转化pv、uv

    html元素点击事件内添加代码:_hmt.push(['_trackEvent', category, action, opt_label, opt_value]); 1. '_trackEvent' ...

  9. wamp下配置多域名和访问路径的方法

    wamp下配置多域名和访问路径的方法 1.到安装目录下,打开配置httpd.confD:\wamp\bin\apache\Apache2.2.21\conf\httpd.conf也可以通过wamp图标 ...

  10. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...