`
gao_20022002
  • 浏览: 164851 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

think in java回顾整理之RTTI

    博客分类:
  • Java
阅读更多

运行期类型鉴定(RTTI)的概念初看非常简单——手上只有基础类型的一个句柄时,利用它判断一个对象的正确类型。

如何利用Java在运行期间查找对象和类信息:
一种是“传统”RTTI,它假定我们已在编译和运行期拥有所有类型;另一种是“反射”机制,利用它可在运行期独立查找类信息。

多形性是面向对象程序设计的一个常规目标。

类型信息在运行期是如何表示的?
这时要用到一个名为“Class对象”的特殊形式的对象,其中包含了与类有关的信息(有时也把它叫作“元类”)。
事实上,我们要用Class对象创建属于某个类的全部“常规”或“普通”对象。
对于作为程序一部分的每个类,它们都有一个Class对象。换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当地说,是保存在一个完全同名的.class文件中)。在运行期,一旦我们想生成那个类的一个对象,用于执行程序的Java虚拟机(JVM)首先就会检查那个类型的Class对象是否已经载入。若尚未载入,JVM就会查找同名的.class文件,并将其载入。所以Java程序启动时并不是完全载入的,这一点与许多传统语言都不同。
一旦那个类型的Class对象进入内存,就用它创建那一类型的所有对象。

Class对象和其他任何对象都是类似的,所以能够获取和控制它的一个句柄(装载模块就是干这件事的)。
为获得Class的一个句柄,一个办法是使用forName()。它的作用是取得包含了目标类文本名字的一个String(注意拼写和大小写)。最后返回的是一个Class句柄。

每个Class只有在它需要的时候才会载入。

“类标记”:
类标记不仅可以应用于普通类,也可以应用于接口、数组以及基本数据类型。
除此以外,针对每种基本数据类型的封装器类,它还存在一个名为TYPE的标准字段。TYPE字段的作用是为相关的基本数据类型产生Class对象的一个句柄。


RTTI形式包括:
(1) 经典造型,它用RTTI确保造型的正确性,并在遇到一个失败的造型后产生一个ClassCastException违例。
(2) 代表对象类型的Class对象。可查询Class对象,获取有用的运行期资料。
(3)关键字instanceof告诉我们对象是不是一个特定类型的实例(Instance即“实例”)

编译器能够自动上溯造型,编译器不允许自动下溯造型,除非明确指定一次这样的造型。

Class的newInstance()方法似乎是克隆(clone())一个对象的另一种手段。但两者是有区别的。利用newInstance(),我们可在没有现成对象供“克隆”的情况下新建一个对象。
利用newInstance()方法可以实现“虚拟构建器”。

用newInstance()创建的类必须有一个默认构建器。
没有办法用newInstance()创建拥有非默认构建器的对象,所以在Java 1.0中可能存在一些限制。
然而,Java 1.1的“反射”API(下一节讨论)却允许我们动态地使用类里的任何构建器。


编译器必须明确知道RTTI要处理的所有类。
(1) 基于组件的程序设计。“反射”提供了一种特殊的机制,可以侦测可用的方法,并产生方法名。通过Java Beans,可以为这种基于组件的程序设计提供了一个基础结构。
(2) 通过网络创建与执行位于远程系统上的对象。这就叫作“远程方法调用”(RMI),它允许Java程序使用由多台机器发布或分布的对象。

在Java 1.1中,Class类得到了扩展,可以支持“反射”的概念。
针对Field,Method以及Constructor类,它们都新增了一个库:java.lang.reflect。
这些类型的对象都是JVM在运行期创建的,用于代表未知类里对应的成员。
这样便可用构建器创建新对象,用get()和set()方法读取和修改与Field对象关联的字段,以及用invoke()方法调用与Method对象关联的方法。
此外,我们可调用方法getFields(),getMethods(),getConstructors(),分别返回用于表示字段、方法以及构建器的对象数组。
因此,匿名对象的类信息可在运行期被完整的揭露出来,而在编译期间不需要知道任何东西。

“反射”并没有什么神奇的地方。
通过“反射”同一个未知类型的对象打交道时,JVM只是简单地检查那个对象,并调查它从属于哪个特定的类(就象以前的RTTI那样)。
但在这之后,在我们做其他任何事情之前,Class对象必须载入。


RTTI和“反射”之间唯一的区别:
对RTTI来说:编译器会在编译期打开和检查.class文件。换句话说,我们可以用“普通”方式调用一个对象的所有方法;
对“反射”来说:.class文件在编译期间是不可使用的,而是由运行期环境打开和检查。

Class.forName()产生的结果不能在编译期间获知,所以所有方法签名信息都会在运行期间提取。可对一个编译期完全未知的对象进行实际的设置以及发出方法调用。

Java的要求是让我们尽可能地采用多形性,只有在极特别的情况下才使用RTTI。

RTTI的优点:
若基础类来自一个库,或者由别的什么东西控制着,RTTI便是一种很好的解决方案:可继承一个新类型,然后添加自己的额外方法。在代码的其他地方,可以侦测自己的特定类型,并调用那个特殊的方法。这样做不会破坏多形性以及程序的扩展能力,因为新类型的添加不要求查找程序中的switch语句。但在需要新特性的主体中添加新代码时,就必须用RTTI侦测自己特定的类型。
从某个特定类的利益的角度出发,在基础类里加入一个特性后,可能意味着从那个基础类衍生的其他所有类都必须获得一些无意义的“鸡肋”。这使得接口变得含义模糊。RTTI提供了一个更合理的解决方案,可将方法置入特定的类中——这样做是可行的。
RTTI有时能解决效率问题。

 

Class.forName用的是java的动态加载机制(RTTI),和反射我觉得是两码事。

分享到:
评论

相关推荐

    Think in Java(中文版)chm格式

    14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable 14.5.1 过多的线程 14.6 总结 14.7 练习 第15章 网络编程 15.1 机器的标识 15.1.1 ...

    Thinking in Java 中文第四版+习题答案

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm ------------------------------------------------- 本教程由yyc,spirit整理 ------------------------------------------------- “Thinking in Java...

    Java进阶教程之运行时类型识别RTTI机制

    每种Java类在运行时都有一个与之关联的`Class`对象,这个对象包含了类的所有元数据,如类名、包名、接口、方法等。通过`Class`对象,我们可以获取到关于对象类型的各种信息,实现动态类型检查和动态方法调用。 首先...

    举例讲解Java的RTTI运行时类型识别机制

    Java的RTTI(Runtime Type Information,运行时类型信息)机制是Java语言的一个重要特性,它允许程序在运行时检查对象的实际类型。RTTI使得在编译时未知类型的对象能够在运行时进行适当的处理,从而增强了代码的灵活...

    Thinking in Java简体中文(全)

    14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable 14.5.1 过多的线程 14.6 总结 14.7 练习 第15章 网络编程 15.1 机器的标识 15.1.1 服务器和客户机 ...

    Thinking_in_java(chapter10).pdf

    从给定文件的【部分内容】中我们可以了解到,该文档主要讲述了Java中运行时类型识别(RTTI)的原理和用途,以及Java中的反射机制。在此基础上,我们进一步探讨Java中RTTI和反射的相关知识点。 知识点一:运行时类型...

    Thinking in Java Fourth Edition

    ### 《Thinking in Java》第四版重要知识点概览 #### 第1章 对象入门 - **对象的概念**:介绍面向对象编程的基本概念,包括对象、类、实例等。 - **创建对象**:详解如何在Java中创建对象,包括使用`new`关键字。 -...

    Java的RTTI和反射机制代码分析

    Java的RTTI(运行时类型识别)和反射机制是两种强大的工具,它们允许程序在运行时检查和操作类的信息及对象。RTTI是Java的一种特性,它使得在编译后的程序中仍然可以在运行时获取对象的实际类型信息。这在处理多态性...

    RTTI.rar_ RTTI_rtti

    运行时类型识别(Runtime Type Information,简称RTTI)是C++语言中的一种特性,它允许在程序运行期间获取对象的实际类型信息。RTTI是C++为面向对象编程提供的一项强大工具,尤其在多态性编程中,能够帮助我们实现更...

    Delphi的RTTI机制文档

    **Delphi的RTTI机制详解** RTTI,全称Runtime Type Information(运行时类型信息),是编程语言中的一种特性,允许程序在运行时获取对象的类型信息。在Delphi中,RTTI是一个强大的工具,它使得开发者能够在运行时...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    “Thinking in Java”详细目录   写在前面的话 引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 ...

    个人收集的RTTI机制

    1. `dynamic_cast`:这是RTTI的核心操作之一,用于在运行时进行安全类型转换。例如,从基类指针或引用转换为派生类指针或引用,或者从指向void指针的转换。如果转换不成功,`dynamic_cast`会返回空指针(对于指针)...

    RTTI.zip_DELPHI RTTI_delphi_rtti

    Delphi的运行时类型信息(Runtime Type Information,简称RTTI)是其强大的特性之一,它允许程序员在程序运行时获取对象或类的类型信息。在Delphi中,RTTI可以帮助我们进行动态类型检查、反射操作以及自动生成代码等...

    JAVA_Thinking in Java

    14.2.3 回顾Java Beans 14.3 堵塞 14.3.1 为何会堵塞 14.3.2 死锁 14.4 优先级 14.4.1 线程组 14.5 回顾runnable 14.5.1 过多的线程 14.6 总结 14.7 练习 第15章 网络编程 15.1 机器的标识 15.1.1 服务器和客户机 ...

    MFC RTTI代码(博客中使用资源)

    在C++编程中,RTTI(Run-Time Type Information,运行时类型信息)是一种特性,它允许程序员在程序运行时查询对象的实际类型。MFC(Microsoft Foundation Classes)是微软提供的一个C++类库,用于构建Windows应用...

    RTTI.rar_rtti

    运行时类型信息(Runtime Type Information,简称RTTI)是C++语言中的一种特性,它允许在程序运行期间查询对象的类型信息。RTTI是C++为了实现多态性而引入的重要工具,尤其在处理基类指针指向派生类对象的情况时,...

    MFC的RTTI和动态创建仿真

    在C++编程中,运行时类型信息(RTTI,Runtime Type Information)和动态创建是两个重要的概念,尤其在面向对象编程中发挥着关键作用。MFC(Microsoft Foundation Classes)库,作为微软为Windows应用程序开发提供的...

    c++ RTTI解析

    ### C++ RTTI深度解析 #### 一、引言 C++ 的运行时类型识别 (Run-Time Type Information, RTTI) 是一种强大的特性,允许程序在运行时获取对象的类型信息,这对于支持诸如多态性等功能至关重要。本文将深入探讨 C++...

Global site tag (gtag.js) - Google Analytics