thingking in java 读书笔记---RTTI

来源:互联网 发布:linux vi 查找上一个 编辑:程序博客网 时间:2024/05/16 01:37
 
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(x instanceof Dog){…}
其中x是某个对象的引用,Dog是个类的名字。
2. Class.isInstance()方法。功能一样,语法不同。
语法:if(classA.isInstance(o){…},其中,classA是Class对象,o是某个常规对象的引用。
 
点评一下,上面两个方法有一个特点。判断一个对象是不是属于某个类的时候,会体现出继承的关系,比如class A Extends B{}.在判断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() //获得构造器列表
 
 
原创粉丝点击