`

第十四章 类型信息3.0

 
阅读更多
类型转换前先做检查

迄今为止,我们已知的RTTI形式包括:

1.传统的类型转换,如“(Shape)”,由RTTI确保类型转换的正确性,如果你执行了一个错误的类型转换,就会抛出一个ClassCastException异常。

2.代表对象类型的Class对象。通过查询Class对象可以获取运行期所需的信息。

3. RTTI在Java中还有第三种形式,就是关键字instanceof。它返回一个布尔值,告诉我们对象是不是某个特定类型的实例。你可以用提问的方式使用它,就象这样:

if(x instanceof Dog) 
((Dog)x).bark();


instanceod与Class的等价性

在查询类型信息时,以instanceof的形式(或者是以isInstance()的形式,它们产生相同的结果)与直接比较Class对象有一个很重要的差别。下面的例子向你展示了这种差别:

"Testing x of type class c10.Derived",
"x instanceof Base true",
"x instanceof Derived true",
"x.getClass() == Base.class false",
"x.getClass() == Derived.class true",

instanceof保持了类型的概念,它指的是“你是这个类吗,或者你是这个类的派生类吗?”而另一种情况是,如果你用==比较实际的Class对象,就不包含继承关系。

反射:运行时的类信息

Class类(本章前面已有论述)支持反射的概念,Java附带的库java.lang.reflect包含了Field,Method以及Constructor类(每个类都实现了Member接口)。这些类型的对象是由JVM在运行期创建的,用以表示未知类里对应的成员。这样你就可以使用Constructor创建新的对象,用get()和set()方法读取和修改与Field对象关联的属性,用invoke()方法调用与Method对象关联的方法。另外,你还可以调用getFields(),getMethods(),getConstructors()等等很便利的方法,以返回表示属性、方法以及构造器的对象数组,这些对象(在JDK文档中,可找到与Class类相关的更多的资料)。这样,匿名对象的类信息就能在运行期被完全确定下来,而在编译期不需要知道任何事情。

重要的是,反射机制并没有什么魔法。当你通过反射与一个未知类型的对象打交道时,JVM只是简单地检查这个对象,看它属于哪个特定的类(就象RTTI那样)。但在这之后,在做其它事情之前,必须加载那个类的Class对象。因此,那个类的.class文件对于JVM来说必须是可获取的,要么在本地机器上,要么可以通过网络取得。所以RTTI和反射之间真正的区别只在于,对RTTI来说,编译器在编译期打开和检查.class文件。(换句话说,我们可以用“普通”方式调用一个对象的所有方法。)而对于反射机制来说.class文件在编译期间是不可获取的,所以是在运行期打开和检查.class文件。
分享到:
评论

相关推荐

    OpenGL ES 3.0

     第14章——OpenGL ES 3.0高级编程  第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子...

    USB3.0标准V0.75版本

    该版本主要针对前一版进行了修订,特别是对第6章、第7章、第8章、第10章和第11章进行了更新。 #### 二、目标与范围 本规范的目标在于定义一套全新的USB接口标准,以满足高速数据传输的需求,并兼容现有的USB2.0...

    OpenGL ES 3.0编程指南第2版[中文][PDF]

    第14章介绍OpenGL ES 3.0高级编程,包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染和投影纹理等渲染技术。;第15章提供OpenGL ES 3.0中各种可用状态查询的参考;第16...

    EJB3.0中文文档

    #### 第一章:EJB知识与运行环境配置 **1.1 什么是ENTERPRISE JAVA BEANS (EJB)** EJB(Enterprise JavaBeans)是一种Java标准,用于构建分布式、健壮的企业级应用程序。它允许开发者通过将业务逻辑封装到可重用...

    Foundation Actionscript 3.0 Animation

    第14章反向运动:拖动和伸展 14.1伸展和拖动一个关节 14.1.1伸展一个关节 14.1.2拖动一个关节 14.2拖动多个关节 14.2.1拖动两个关节 14.2.2拖动更多的关节 14.3伸展多个关节 14.3.1向鼠标伸展 14.3.2向一个物体伸展 ...

    PROGRAMMING ACTIONSCRIPT 3.0

    #### 第14章:绘图API - **基本概念**:概述了ActionScript中的绘图API,包括如何绘制线条、曲线、形状等。 - **Graphics类**:讲解了Graphics类的使用方法,以及如何利用该类来实现复杂的图形效果。 - **示例**:...

    Manning.EJB.3.0.in.Action

    #### 第14章:迁移到EJB 3 - **章节内容**:指导如何从旧版EJB迁移到EJB 3.0。 - **核心知识点**: - 迁移策略和步骤。 - 兼容性问题和解决方案。 - 代码重构技巧。 #### 第15章:将EJB暴露为Web服务 - **章节...

    ActionScript3.0开发技术大全(光盘源码)第一部分

    在本书的第一部分中,涵盖了2-15章的内容,这些章节逐步引导读者从基础到进阶,全面理解ActionScript3.0的语法特性和应用技巧。 ActionScript3.0相比之前的版本有了显著的提升,包括性能增强、类型系统更加严谨、...

    Redis 3.0 中文版 - v1.1.pdf

    第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 字符串 (Strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....

    C#与.NET3.5高级程序设计 part14 rar

    第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...

    Manning EJB3.0 in action

    根据提供的文件信息,我们可以推断出这是一本关于EJB 3.0的书籍,书名为《Manning EJB3.0 in action》。虽然标题和描述中的故事似乎与EJB 3.0无关,但从部分内容来看,这本书显然是专注于EJB 3.0的技术细节及其在...

    Redis V3.0 中文文档

    第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 字符串 (Strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...

    C#与.NET3.5高级程序设计 part18 rar

    第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...

    C#与.NET3.5高级程序设计 part03

    第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...

    C#与.NET3.5高级程序设计 part02

    第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...

    C#与.NET3.5高级程序设计 part17 rar

    第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...

    C#与.NET3.5高级程序设计 part16 rar

    第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...

Global site tag (gtag.js) - Google Analytics