运行时类型识别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 ...
随机推荐
- Bunch 转换为 HDF5 文件:高效存储 Cifar 等数据集
关于如何将数据集封装为 Bunch 可参考 关于 『AI 专属数据库的定制』的改进. PyTables 是 Python 与 HDF5 数据库/文件标准的结合.它专门为优化 I/O 操作的性能.最大限 ...
- 镣铐之舞:美团安全工程师Black Hat USA演讲
背景 2018年8月9日,全球顶级安全会议——Black Hat USA在美国拉斯维加斯的曼德勒海湾会议中心落下了帷幕,这场盛会在全球黑客心中几乎等同于“世界杯”和“奥斯卡”一样的存在.这场一年一度的 ...
- 线性表之顺序栈C++实现
线性表之顺序栈 栈是限定仅在表尾(栈顶)进行插入删除操作的线性表,FILO:先进后出 一.顺序栈的头文件:SeqStack.h //顺序栈头文件 #include<iostream> us ...
- [BZOJ4569][SCOI2016]萌萌哒(倍增+并查集)
首先有一个显然的$O(n^2)$暴力做法,将每个位置看成点,然后将所有限制相等的数之间用并查集合并,最后答案就是9*(10^连通块的个数).(特判n=1时就是10). 然后比较容易想到的是,由于每次合 ...
- Vue的过渡或动画
一.过渡的类名 在进入/离开的过渡中,共有6种class进行切换,分别是v-enter,v-enter-active,v-enter-to,v-leave,v-leave-active,v-leave ...
- 细说React(一)
React 是近期非常热门的一个前端开发框架. 这篇文章将介绍如何使用 React 来创建用户界面,希望能够起到抛砖引玉的效果. "React, A JAVASCRIPT LIBRARY ...
- URAL 1880 Psych Up's Eigenvalues
1880. Psych Up's Eigenvalues Time limit: 0.5 secondMemory limit: 64 MB At one of the contests at the ...
- bestcoder#23 1001 Sequence
Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Hibernate与MyBatis的对比总结
最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处. 第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出 ...
- 使用 Headless Chrome 进行页面渲染 - 知乎专栏
使用 Headless Chrome 进行页面渲染 - 知乎专栏 使用 Headless Chrome 进行页面渲染 - 知乎专栏 这里我们使用 chrome-remote-interface 来远程 ...