Java中的RTTI
来源:互联网 发布:校园网络自助平台 编辑:程序博客网 时间:2024/06/16 09:04
并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息)。
代表对象类型的Class对象,通过它可以获取运行时所需的信息;
关键字instanceof,if(x instanceof Y),检查对象x是否从属于Y类。
在c2中,即使我们将Women对象的引用向上转换为Human对象的引用,对象所指向的Class类对象依然是Woman。
Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。
多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。
RTTI形式
传统的类型转换,(MyClass)由RTTI确保类型转换的正确性;代表对象类型的Class对象,通过它可以获取运行时所需的信息;
关键字instanceof,if(x instanceof Y),检查对象x是否从属于Y类。
Class类
Class类是"类的类"(class of classes)。如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合。每一个Class类的对象代表一个其他的类。比如下面的程序中,Class类的对象c1代表了Human类,c2代表了Woman类。
public class Test {public static void main(String[] args) {Human aPerson = new Human();Class c1 = aPerson.getClass();System.out.println(c1.getName());Human anotherPerson = new Woman();Class c2 = anotherPerson.getClass();System.out.println(c2.getName());}}class Human {/** * accessor */public int getHeight() {return this.height;}/** * mutator */public void growHeight(int h) {this.height = this.height + h;}private int height;}class Woman extends Human {/** * new method */public Human giveBirth() {System.out.println("Give birth");return (new Human());}}当我们调用对象的getClass()方法时,就得到对应Class对象的引用。
在c2中,即使我们将Women对象的引用向上转换为Human对象的引用,对象所指向的Class类对象依然是Woman。
Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。
除了getClass()方法外,我们还有其他方式调用Class类的对象。
forName()方法接收一个字符串作为参数,该字符串是类的名字。这将返回相应的Class类对象。
Woman.class方法是直接调用类的class成员。这将返回相应的Class类对象
public class Test{ public static void main(String[] args) { Class c3 = Class.forName("Human"); System.out.println(c1.getName()); Class c4 = Woman.class System.out.println(c2.getName()); }}上面显示了两种方式:
forName()方法接收一个字符串作为参数,该字符串是类的名字。这将返回相应的Class类对象。
Woman.class方法是直接调用类的class成员。这将返回相应的Class类对象
Class类的方法
Class对象记录了相应类的信息,比如类的名字,类所在的包等等。我们可以调用相应的方法,比如:
getName() 返回类的名字
getPackage() 返回类所在的包
可以利用Class对象的newInstance()方法来创建相应类的对象,比如:
Human newPerson = c1.newInstance();
newInstance()调用默认的不含参数的构建方法。
我们可以获得类定义的成员:
getFields() 返回所有的public数据成员
getMethods() 返回所有的public方法
可以进一步使用Reflection分析类。这里不再深入。
getName() 返回类的名字
getPackage() 返回类所在的包
可以利用Class对象的newInstance()方法来创建相应类的对象,比如:
Human newPerson = c1.newInstance();
newInstance()调用默认的不含参数的构建方法。
我们可以获得类定义的成员:
getFields() 返回所有的public数据成员
getMethods() 返回所有的public方法
可以进一步使用Reflection分析类。这里不再深入。
Class类的加载
当Java创建某个类的对象,比如Human类对象时,Java会检查内存中是否有相应的Class对象。
如果内存中没有相应的Class对象,那么Java会在.class文件中寻找Human类的定义,并加载Human类的Class对象。
在Class对象加载成功后,其他Human对象的创建和相关操作都将参照该Class对象。
如果内存中没有相应的Class对象,那么Java会在.class文件中寻找Human类的定义,并加载Human类的Class对象。
在Class对象加载成功后,其他Human对象的创建和相关操作都将参照该Class对象。
阅读全文
0 0
- Java中的RTTI
- Java中的RTTI与反射
- 谈谈Java中的类型识别RTTI
- Java中的RTTI和反射机制
- Java中的RTTI和反射机制
- Java RTTI
- java RTTI
- Java RTTI
- Java RTTI
- [Java] RTTI
- RTTI在Java中的三种存在形式
- 关于MFC中的RTTI
- BCB中的RTTI机制
- C++中的RTTI(转)
- C++中的RTTI实现
- 了解C++中的RTTI
- C++中的RTTI介绍
- C++中的RTTI介绍
- JS事件监听的添加方法
- TCP慢启动、拥塞避免、快速重传、快速恢复
- 【坑爹微信】微信支付相关问题解决
- 欢迎使用CSDN-markdown编辑器
- centos 6.5安装使用 redis
- Java中的RTTI
- 新闻案例
- 静态查找
- Android 沉浸式状态栏
- PyMongo初级使用教程
- js 全屏显示
- HBuilder控制台集成命令提示符(终端/CMD)功能
- ospfj
- Mac使用mysql中出现ERROR 1045: Access denied for user: 'root@localhost' 以及密码过期解决方法