您的位置:首页 > 编程语言 > Java开发

thingking in java 读书笔记---RTTI

2007-05-11 21:35 253 查看
RTTI,看完了这一章,我才算是明白了java的强大之处,运行时刻类型检查,我想MFC中对RTTI的实现应该是模仿的java吧,至少它们的机理是一样的,不过java中RTTI功能工强大一些。
RTTI可以分两种类型,一种就是传统的RTTI,它假定我们在编译期就知道所有的类型,基本上多数的应用程序都属于这一种。另外一种更牛,是reflection发射机制,它能在我们的程序中没有这个类的定义源代码的时候,就能获得这个类的函数接口。

先说第一种,java中向上转型是自动的,因为不会有信息丢失,一定能行得通,因为子类就是父类的一种。向下转型的时候,我们就需要强制类型转换,这个语法与c++中是一样的,实现却不同,c++中需要有程序员来确保转型逻辑的正确,而java中更安全,虚拟机在运行时刻可以进行类型检查,确保转型的正确性,否则抛出ClassCastException,这是RuntimeException的子类。


Class类:RTTI的实现主要靠的就是这个Class类,类型信息都存储在Class对象中,其实,Class对象正是被用来创建常规对象的。每当你编写编译一个类时,就会产生这个类的Class对象(存储在同名的.class文件中)。要生成这个类的常规对象,首先检查这个类的Class对象是否已经加载。


常规类和其对应的Class对象的引用的获得方法:

从类名字ClassName到其Class对象的引用:

Class.forName(“ClassName”);

ClassName.class//基本数据类型也可以,如int.class

ClassObject.getClass//需要已经存在的对象,不是static的方法。


从Class对象构建常规对象:

使用Class对象的newInstance函数。调用的是没有参数的构造函数。


判断一个对象的类型:3种方法。

1.instanceof关键字

语法:if(xinstanceofDog){…}

其中x是某个对象的引用,Dog是个类的名字。

2.Class.isInstance()方法。功能一样,语法不同。

语法:if(classA.isInstance(o){…},其中,classA是Class对象,o是某个常规对象的引用。


点评一下,上面两个方法有一个特点。判断一个对象是不是属于某个类的时候,会体现出继承的关系,比如classAExtendsB{}.在判断B的对象是不是属于A类的时候,得到true。


3.if(x.getClass()==ClassName.class)

if(x.getClass().equals(ClassName.class))

上面两种方法功能完全一样。比较的时候,不会体现出继承关系。子类对象与父类比较时,得到false。


//////////////////////////

reflection反射

这是更高级的东西,从Class对象里面可以直接提取出类的函数信息。这个功能可以与c++对比,当然有个前提是需要类的.class文件,也就是需要对应的Class对象。


这个功能使得java能构支持基于构件的编程,javabean,在远程创建和运行对象。

具体的语法见Class类的函数:

getFields获得成员列表()//

getMethods()//获得函数列表

getConstructors()//获得构造器列表


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: