RTTI和反射小结

Java有两种方式让我们在运行时识别对象和类的信息:1、“传统的”RTTI,假定所有的类型编译时已知;2、“反射”机制,允许在运行时发现和使用类的信息。

一、RTTI

RTTI(Run-Time Type Infomation),在运行时识别一个对象的信息。RTTI的形式有三种:

1、传统的类型转换

  如“Shape s=(Shape) new Circle()”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。

2、代表对象的类型的Class对象

  Class对象包含了与类有关的信息,每个类都有一个Class对象,每当编写并编译一个新类,就会产生一个Class对象(被保存在一个同名的.class文件中)。

  无论何时,要想在运行时使用类型信息,就必须首先获取对恰当的Class对象的引用。有以下几种方式可获取:

  • Class.forName(),不需要为获取Class引用而持有该类型的对象;
  • obj.getClass(),类Object方法,返回对象实际类型的Class引用;
  • Shape.class,类字面量,编译时检查,当使用“.class”来创建对Class对象的引用时,不会自动地初始化Class对象。

3、instanceof或者isInstance()

  考虑了继承,表示“是否这个类,或者是否这个类的派生类”。

二、反射

Class类和java.lang.reflect类库一起对反射的概念进行了支持。该类库包含了Filed、Method和Constructor类(每个类都实现了Member接口),这些类型的对象是由JVM在运行创建的,用以表示未知类里对应的成员。

主要的一些方法:getFileds()、getMethods()、getConstructors()和invoke()。

RTTI和反射的主要区别:对RTTI,编译器在编译时打开和检查.class文件;对反射,在运行时打开和检查.class文件。

时间: 2024-12-26 12:07:11

RTTI和反射小结的相关文章

【Java基础】RTTI与反射之Java

一.引言 很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象.在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假定我们在编译时已经知道了所有类型.2.反射机制,运行我们在运行时发现和使用类的信息. 二.RTTI RTTI(Run-Time Type Infomation),运行时类型信息.可以在运行时识别一个对象的类型.类型信息在运行时通过Class对象表示,Class对象包含与类有关的信息,可以使用Clas

QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化

元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数,多重祖先元类,method, property, Enumerator, Signal, Slot等等 http://doc.qt.io/qt-5/qobject.html http://doc.qt.io/qt-5/qmetaobject.html 我感觉Qt的出现,除了提供GUI以外,主要就是提

Java系列笔记(2) - Java RTTI和反射机制

目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). 在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本文主要讲反射方式实现的RTTI,建议在阅读本文之前,先了解类的加载机制(

RTTI与反射之Java

一.引言 很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象.在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假定我们在编译时已经知道了所有类型.2.反射机制,运行我们在运行时发现和使用类的信息. 二.RTTI RTTI(Run-Time Type Infomation),运行时类型信息.可以在运行时识别一个对象的类型.类型信息在运行时通过Class对象表示,Class对象包含与类有关的信息,可以使用Clas

Java基础:RTTI与反射

转载请注明出处:jiq?钦's technical Blog 1 Class文件: class文件全名称为Javaclass文件,主要在平台无关性和网络移动性方面使Java更适合网络.它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务. 每一个类都有一个Class类型的对象,每当一个类被编译,就会产生一个Class对象(保存在同名的.class文件中): 2 Class文件加载时机: 运行时按需加载. 与普通程序不同的是,Java程序(class文件)并不是本地的

java之RTTI和反射的理解

最近在读 Thinking in Java 这本书.读到类型信息这一张时,刚开始对书中所说的RTTI和反射彻底混了,不知道有什么联系,有哪些相同点和区别.于是在网上又找了些内容辅助理解,这一章又重新读了一遍,对上面的这些疑问有了自己的答案,想到RTTI和反射时,脑海中有了自己的轮廓. 它俩的目的一样: 在运行时,识别对象和类的信息. 相同点: 目的相同: 功能都是通过Class类来实现的 不同点: RTTI:(主要作用在多态中,比如参数传递) 它假定我们在编译时已经知道所有类型,会打开和检查所有

类型信息(RTTI和反射)——反射

运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就来说说反射. 重点说说通过反射获取方法以及调用方法,即类方法提取器. 1.反射: 如果你不知道一个对象的确定类型,RTTI可以告诉你.但是有个限制:这个类型在编译期间必须已知,才能使用RTTI来识别它.例如,在磁盘上或者网络中的一段字符串,被告知代表一个类,但是编译器在编译代码的时候,并不知道,怎么才能使用这个类呢?这时候就需要使用反射. 通过反射与未知类型的对

13. Java基础之类型信息(RTTI和反射)

一. 背景 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). Java是如何让我们在运行时识别对象和类的信息的,主要有两种RTTI的方式,一种是"传统的"RTTI,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 二. RTTI RTTI(Run-Time Type Infomation),运行时

java的RTTI和反射机制

RTTI,即Run-Time Type Identification,运行时类型识别.它假定我们在编译时已经知道了所有的类型.那么在运行时就能够自动识别每个类型. 很多时候需要进行向上转型,比如Base类派生出Derived类,但是现有的方法只需要将Base对象作为参数,实际传入的则是其派生类的引用.那么RTTI就在此时起到了作用,比如通过RTTI能识别出Derive类是Base的派生类,这样就能够向上转型为Derived.类似的,在用接口作为参数时,向上转型更为常用,RTTI此时能够判断是否可