运行时类型识别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());
}
}
运行时类型识别RTTI的更多相关文章
- C++学习之显式类型转换与运行时类型识别RTTI
static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情 ...
- c++运行时类型识别(rtti)
一个简单运行时类型识别 namespace rtti_ex { /* * 类型信息基类 */ class i_type_info { public: // 判断是否是指定类型 bool is(cons ...
- C++之运行时类型识别RTTI
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- C++——运行时类型识别RTTI
1.实现方式 typeid运算符,返回表达式的类型 dynamic_cast运算符,基类的指针或引用安全地转换成派生类的指针或引用 2.适用于:使用基类的指针或引用执行派生类的操作,且该操作不是虚函数 ...
- Java基础之RTTI 运行时类型识别
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...
- RTTI 运行时类型识别 及异常处理
RTTI 运行时类型识别 typeid ------ dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
- MFC六大核心机制之二:运行时类型识别(RTTI)
上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...
- 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)
框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...
随机推荐
- Docker应用系列(六)| 如何去掉sudo及避免权限问题
一.如何在使用docker时去掉sudo 1.添加账户 $ sudo groupadd docker 2.授权给docker账户 sudo gpasswd -a yourname docker 3.重 ...
- 洛谷P1154 奶牛分厩
P1154 奶牛分厩 173通过 481提交 题目提供者该用户不存在 标签高性能 难度普及- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 测试点3??? 求助!超时了 我抗议 ...
- 理解Django的makemigrations和migrate
在你改动了 model.py的内容之后执行下面的命令: python manger.py makemigrations 相当于在该app下建立 migrations目录,并记录下你所有的关于modes ...
- MSSQL 基础知识与语句笔记
建库 CREATE DATABASE 数据库名 ON[PRIMARY] --默认属于PRIMARY主文件组,可省略 ( NAME='', --主数据文件的逻辑名 名称 FILEAME='', --主数 ...
- Git 工具的使用,windows平台安装
先谈谈版本控制的一些事 如果你严肃对待编程,就必定会使用"版本控制系统"(Version Control System). 随着信息科技的发展,软件开发已不是小手工作坊,软件的规模 ...
- MyBatis -- generator 逆向工程
一.引言 官网文档:http://www.mybatis.org/generator/index.html 通过使用官方提供的mapper自动生成工具,mybatis-generator-core-1 ...
- 【10.4校内测试】【轮廓线DP】【中国剩余定理】【Trie树+博弈】
考场上几乎是一看就看出来轮廓线叻...可是调了两个小时打死也过不了手出样例!std发下来一对,特判对的啊,转移对的啊,$dp$数组竟然没有取max!!! 某位考生当场死亡. 结果下午又请了诸位dala ...
- hdoj 5182 PM2.5 排序
PM2.5 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Descr ...
- ZOJ 3626 Treasure Hunt I 树上DP
E - Treasure Hunt I Time Limit:2000MS Memory Limit:65536KB Description Akiba is a dangerous country ...
- SGU 405 Totalizator
405. Totalizator Time limit per test: 0.25 second(s)Memory limit: 65536 kilobytes input: standardout ...