类型转换前先做检查
迄今为止,我们已知的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文件。
分享到:
相关推荐
第14章——OpenGL ES 3.0高级编程 第14章是核心章节,将本书介绍的许多主题串联在一起。我们已经选择了高级渲染技术的一个样本,并展示了实现这些功能的示例。该章包含使用法线贴图的逐像素照明、环境贴图、粒子...
该版本主要针对前一版进行了修订,特别是对第6章、第7章、第8章、第10章和第11章进行了更新。 #### 二、目标与范围 本规范的目标在于定义一套全新的USB接口标准,以满足高速数据传输的需求,并兼容现有的USB2.0...
第14章介绍OpenGL ES 3.0高级编程,包含使用法线贴图的逐像素照明、环境贴图、粒子系统、图像后处理、程序纹理、阴影贴图、地形渲染和投影纹理等渲染技术。;第15章提供OpenGL ES 3.0中各种可用状态查询的参考;第16...
#### 第一章:EJB知识与运行环境配置 **1.1 什么是ENTERPRISE JAVA BEANS (EJB)** EJB(Enterprise JavaBeans)是一种Java标准,用于构建分布式、健壮的企业级应用程序。它允许开发者通过将业务逻辑封装到可重用...
第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向一个物体伸展 ...
#### 第14章:绘图API - **基本概念**:概述了ActionScript中的绘图API,包括如何绘制线条、曲线、形状等。 - **Graphics类**:讲解了Graphics类的使用方法,以及如何利用该类来实现复杂的图形效果。 - **示例**:...
#### 第14章:迁移到EJB 3 - **章节内容**:指导如何从旧版EJB迁移到EJB 3.0。 - **核心知识点**: - 迁移策略和步骤。 - 兼容性问题和解决方案。 - 代码重构技巧。 #### 第15章:将EJB暴露为Web服务 - **章节...
在本书的第一部分中,涵盖了2-15章的内容,这些章节逐步引导读者从基础到进阶,全面理解ActionScript3.0的语法特性和应用技巧。 ActionScript3.0相比之前的版本有了显著的提升,包括性能增强、类型系统更加严谨、...
第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 字符串 (Strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...
根据提供的文件信息,我们可以推断出这是一本关于EJB 3.0的书籍,书名为《Manning EJB3.0 in action》。虽然标题和描述中的故事似乎与EJB 3.0无关,但从部分内容来看,这本书显然是专注于EJB 3.0的技术细节及其在...
第 2 章数据类型初探. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 字符串 (Strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...
第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...
第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...
第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...
第14章 LINQ.pdf 第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第...