Java中的RTTI
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的更多相关文章
- C++中的RTTI机制解析
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...
- Java进阶04 RTTI
链接地址:http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html 作者:Vamei 出处:http://www.cnblogs.com ...
- delpi中的RTTI初试
java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo: 1.先定义一 ...
- Java基础之RTTI 运行时类型识别
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...
- Java中Class类详解、用法及泛化
Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...
- Java中Class类及用法
Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI.这项信息纪录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方 ...
- java中一些常用的英语
abstract (关键字 ) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.rie ...
- JAVA中的类
节选自:http://www.cnblogs.com/dolphin0520/p/3811445.html 1. 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一 ...
- Thinking in Java -- 类型信息RTTI
Thinking in Java – 类型信息 个人感觉 java 中的比較难的部分了,在看了些netty源代码发现事实上这块很实用. 这章重点是RTTI和反射.先说下自己的理解 RTTI是执行时识别 ...
随机推荐
- 主成分分析(PCA)算法,K-L变换 角度
主成分分析(PCA)是多元统计分析中用来分析数据的一种方法,它是用一种较少数 量的特征对样本进行描述以达到降低特征空间维数的方法,它的本质实际上是K-L变换.PCA方法最著名的应用应该是在人脸识别中特 ...
- CentOS6.5安装HBase集群及多HMaster配置
1.配置SSH免登录 请参考:http://www.cnblogs.com/hunttown/p/5470357.html 服务器配置: Hadoop-NN-01 主Hadoop-NN-02 备Had ...
- RMAN中%d %t %s %u,%p,%c 等代替变量的意义
backup incremental level 0 database format='LEV0_%d_%t_%U_%s_%p' format=string 文件路径和名称的格式串,其中可包含宏变量: ...
- 机器学习理论基础学习9--- EM 算法
EM算法的适用场景: EM算法用于估计含有隐变量的概率模型参数的极大似然估计,或者极大后验概率估计. 当概率模型既含有观测值,又含有隐变量或潜在变量时,就可以使用EM算法来求解概率模型的参数. 当概率 ...
- Pandas之Dropna滤除缺失数据
import pandas as pd import numpy as np from numpy import nan as NaN 一.处理Series对象 通过dropna()滤除缺失数据 fr ...
- BCB TLable控件透明背景属性
当我们希望一个Label适应它父窗口的背景时,设置Tranparent属性值就OK Transparent:true 透明 false 不透明
- js自执行函数的常见写法
js自执行函数的常见写法 2016-12-20 20:02:26 1.关于自执行函数 1.1 写自执行函数的好处:独立的作用域,不会污染全局环境 (function() { })(); 1.2 理解重 ...
- python 用类方法和静态方法实现是追加写文件内容,和读指定行号的内容
用类方法和静态方法实现:一个是追加写文件一行内容,一个是读指定行号的内容 #coding=utf-8 class handle_file(object): def __init__(s ...
- python进程、多进程
进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当 ...
- 2016NOI冬令营day5
考试 坑坑坑 无法调试 两个小时写的第一题爆零了 O(n)(n<=200)都能被卡T???数据乱搞吧WOC 10分胸牌滚粗