运行时类型识别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 ...
随机推荐
- 二、 sql*plus常用命令
一.sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1).sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户 ...
- Python之路【第十一篇】: 进程与线程理论篇
阅读目录 一 背景知识二 进程2.1 什么是进程2.2 进程与程序的区别2.3 并发与并行2.4 同步与异步2.5 进程的创建2.6 进程的终止2.7 进程的层次结构2.8 进程的状态2.9 进程并发 ...
- pyinstaller 打包错误集锦
最近在用 pyinstaller 打包项目的时候遇到如下错误: RecursionError: maximum recursion depth exceeded 解决方案 执行 pyinstaller ...
- Windows 服务器部署 asp.net core
踩坑日记与 Windows 服务器部署 asp.net core 指南. 准备 操作系统:Windows Server 2008 R2 或更高版本 文件: Microsoft Visual C++ 2 ...
- 线程池--ThreadPoolExecutor
线程池的实现原理 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤 需要获取全局锁). 2)如果运行的线程等于或多于corePoolSize,则将任务加入 ...
- Android与GPL、BSD和Apache之间的关系
参考资料 Android ,在争议中逃离 Linux 内核的 GPL 约束 | 爱范儿 简介 众所周知,Linux内核基于GPL v2发行.GPL规定,基于GPL的软件产品的衍生产品,也必须使用GPL ...
- 美团针对Redis Rehash机制的探索和实践
背景 Squirrel(松鼠)是美团技术团队基于Redis Cluster打造的缓存系统.经过不断的迭代研发,目前已形成一整套自动化运维体系,涵盖一键运维集群.细粒度的监控.支持自动扩缩容以及热点Ke ...
- C# 序列化简单格式XML
问师傅反序列化和序列化到底是什么, 然后师傅鄙视一下我的智商,让我做个反序列化解析XML. 一边听着师傅在旁边跟女朋友打电话收到暴击伤害,一边写,搞了一个半小时. XML文件: <?xml ve ...
- Codeforces Round #489 (Div. 2)
A. Nastya and an Array time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 2 Spring4 之Bean的配置
Spring4 之Bean的配置 1 IOC & DI 概述 IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源 ...