`
dickyzhu
  • 浏览: 111788 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

类型识别与反射

 
阅读更多

运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的“反射”机制。
要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由“Class对象”完成的,它包含了与类有关的信息。类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中(注:在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识。这个信息保存着每个对象所属的类足迹,保存这些信息的类被称为Class。)。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。一般的RTTI形式包括三种:
1. 传统的类型转换。如“(Apple)Fruit”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。
2.  通过Class对象来获取对象的类型。如
Class c = Class.forName(“Apple”);
Object o = c.newInstance();
3.  通过关键字instanceof或Class.isInstance()方法来确定对象是否属于某个特定类型的实例,准确的说,应该是instanceof / Class.isInstance()可以用来确定对象是否属于某个特定类及其所有基类的实例,这和equals() / ==不一样,它们用来比较两个对象是否属于同一个类的实例,没有考虑继承关系。
反射
       如果不知道某个对象的类型,可以通过RTTI来获取,但前提是这个类型在编译时必须已知,这样才能使用RTTI来识别。即在编译时,编译器必须知道所有通过RTTI来处理的类。
使用反射机制可以不受这个限制,它主要应用于两种情况,第一个是“基于构件的编程”,在这种编程方式中,将使用某种基于快速应用开发(RAD)的应用构建工具来构建项目。这是现在最常见的可视化编程方法,通过代表不同组件的图标拖动到图板上来创建程序,然后设置构件的属性值来配置它们。这种配置要求构件都是可实例化的,并且要暴露其部分信息,使得程序员可以读取和设置构件的值。当处理GUI时间的构件时还必须暴露相关方法的细细,以便RAD环境帮助程序员覆盖这些处理事件的方法。在这里,就要用到反射的机制来检查可用的方法并返回方法名。Java通过JavaBeans提供了基于构件的编程架构。
       第二种情况,在运行时获取类的信息的另外一个动机,就是希望能够提供在跨网络的远程平台上创建和运行对象的能力。这被成为远程调用(RMI),它允许一个Java程序将对象分步在多台机器上,这种分步能力将帮助开发人员执行一些需要进行大量计算的任务,充分利用计算机资源,提高运行速度。
       Class支持反射,java.lang.reflect中包含了Field/Method/Constructor类,每个类都实现了Member接口。这些类型的对象都是由JVM在运行时创建的,用来表示未知类里对应的成员。如可以用Constructor类创建新的对象,用get()和set()方法读取和修改与Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。同时,还可以调用getFields()、getMethods()、getConstructors()等方法来返回表示字段、方法以及构造器的对象数组。这样,未知的对象的类信息在运行时就能被完全确定下来,而在编译时不需要知道任何信息。
       另外,RTTI有时能解决效率问题。当程序中使用多态给程序的运行带来负担的时候,可以使用RTTI编写一段代码来提高效率。
分享到:
评论

相关推荐

    超声波检验根部反射波识别与判定概述.doc

    "超声波检验根部反射波识别与判定概述" 超声波检验根部反射波识别与判定是压力管道行业大径焊口焊缝检测中的关键技术。为了提高检测的准确性和效率,需要oroughly 了解根部区域反射波的类型和特点,并对其进行详细...

    5.自动识别Protocolbuf消息类型1

    总的来说,利用Google Protobuf的反射功能,可以自动识别并处理网络传输中的protobuf消息,避免了手动维护类型映射或注册过程,简化了多类型消息的网络通信实现。这种基于类型名称的反射机制是Protobuf设计的一个...

    p波、sv波Zoeppritz方程.zip_P波_p反射系数_zoeppritz_入射波 反射波_反射系数

    在地震勘探领域,P波(纵波)和SV波(剪切波)是两种重要的地震波类型,它们在地壳中传播时与岩石界面相互作用,产生反射和透射现象。Zoeppritz方程是描述这些波在介质界面反射和折射行为的关键数学工具。本压缩包...

    .net中的反射,asp.net反射

    3. 扩展性:在插件式架构中,反射使得程序能够识别和加载外部组件,实现应用程序的扩展和更新。 4. 应用配置:反射可以用于解析和执行配置文件中的设置,使配置更灵活。 5. AOP(面向切面编程):反射可以实现动态...

    反射率与反射色PPT课件.pptx

    此外,反射率还可以揭示矿物的成因类型,比如岩浆成因的磁铁矿与热液成因或区域变质成因的磁铁矿,其反射率会因其特有的化学成分和晶体结构而有所不同。 准确测量金属矿物的反射率对于矿相学的研究至关重要,因为它...

    基于图像识别的二次反射镜面形质量检测方法.pdf

    在这样的背景下,本文提出了一种基于图像识别的二次反射镜面形质量检测方法,旨在解决传统检测方法的不足。该方法主要依赖于一种特殊的彩色编码板,这种板具有周期性分布的彩色色块。将编码板放置在二次反射镜的反射...

    打字稿:发出在运行时使用的类型信息(反射).zip

    它为代码提供了动态性,使得在编译时未知的类型可以在运行时被识别和操作。TypeScript是JavaScript的一个超集,它引入了静态类型系统,但同时也支持通过运行时反射来获取类型信息。 在TypeScript中,反射主要依赖于...

    MODIS地表反射率产品说明书

    地表反射率,即地表对太阳辐射的反射能力,是研究地表覆盖类型、植被状态、土壤湿度、雪冰分布等的重要指标。 ### 产品描述 MODIS地表反射率产品旨在提供高精度的地表反射率数据,适用于多种科学领域,如气候变化...

    消息反射Demo1

    这有助于理解消息反射的流程:获取消息,识别消息类型,调用相应的处理函数。 消息反射的实现通常涉及元数据(metadata)的使用,元数据包含了类、方法和其他程序元素的信息。在.NET框架中,有System.Reflection...

    条码扫描系统与无线射频识别技术

    12. **ICR890系列**:CCD照相型二维全方位扫描,适用于需要同时识别多种类型的标签。 13. **OPS系统**:灵活组合全方位扫描,可以根据实际需要进行配置。 14. **ALIS系统**:专门针对机场行李识别的应用。 #### ...

    OTDR非反射事件自适应检测算法设计与研究.docx

    - **区域分割还原**:此步骤旨在识别并分离OTDR测试曲线中可能存在非反射事件的部分。通过分析曲线特征,可以有效地去除头端事件、终端事件和反射事件的影响,从而聚焦于可能含有非反射事件的关键区域。 - **...

    敌我识别系统的原理

    敌我识别系统可以分为地面识别系统、机载识别系统和舰载识别系统三种类型,分别用于对飞机、舰艇和坦克之间的识别。它们构成了地面、空中、水面统一的雷达敌我识别体系。 雷达敌我识别系统采用有源问答的工作方式,...

    利用反射实现JavaBean 的自动赋值

    5. **类型转换与赋值**:根据参数类型进行相应的类型转换(如字符串转整型、日期类型等),然后调用setter方法完成赋值。 #### 支持的数据类型 根据示例代码,目前支持以下几种类型的自动转换和赋值: - `boolean...

    StructLightOpenCV.rar_before1bh_opencv structLight_焊缝图像焊点识别_结构光_

    5. 结果输出与反馈:最后,将识别结果以可视化方式展示,同时可以与预设标准对比,给出焊接质量的评估和调整建议。 "StructLightOpenCV"这个文件名可能是指项目中的源代码文件,包含了上述流程的具体实现。用户可以...

    遥感反射率相关论文(定义、图像处理)

    2. **地物光谱特性**:研究不同地物的光谱响应,分析其反射率随波长变化的规律,这对于识别地物类型、监测植被生长状况、评估土壤水分等具有重要意义。例如,近红外波段的反射率对于评估植被健康状态特别敏感。 3. ...

    雷达信号识别算法

    标题提到的"雷达信号识别算法"主要涉及对不同类型的雷达信号进行分类和辨识,以提高雷达系统的效能和目标探测能力。描述中提到了"LFM"(线性调频信号)和"NS"(可能指的是噪声信号或非线性信号)这两种常见的雷达...

    Java中的反射

    在Java程序运行过程中,系统会持续对所有对象进行运行时类型识别(RTI),该信息记录了每个对象所属的类。这些信息被存储在一个名为`Class`的特殊类中。`Class`类提供了许多方法来操作类的信息,包括类名、类的父类、...

    薄互层反射系数序列时、频特征研究

    贺锡雷、黄德济等人的研究突破了这一限制,通过建立数学表达式,将不同类型薄互层地质结构的反射系数时间序列与其振幅谱关联起来。他们发现,主瓣周期、旁瓣周期、f=0点和f=fN点的振幅值等六个特征参数与薄互层的...

Global site tag (gtag.js) - Google Analytics