类型信息-RTTI

运行时类型信息使你可以在程序运行时发现和使用类型信息

主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型,另一种是反射机制,它允许我们在允许时发现和使用类的信息。

  1. Class对象

    要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的。

    类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译路一个新类,就会产生一个Class对象。

    所有的类 都是在对其第一次使用时,动态加载到JVM中。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明了构造器也是类的静态方法,即使在构造器之前并没有static关键字。因此,Java程序在它开始运行之前并非被完全加载,其各个部分是在必需时才加载的。

    类加载器首先检查这个类的Class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件。

        可以根据 class c = Class.forName("  ");  //目标类的文本名 或者Class对象的newInstance()方法获取Class 引用。

  2.泛化的class引用

  

1 Class<? extends Number> bounded = int.class; //提供类编译期的类型检查
2 bounded = double.class;
3 bounded = Number.class; 

  3.类型转换前先做类型检查

  有instanceof 方法,只可将其与命名类型进行比较,而不能与Class对象作比较

  例如 if (pet instanceof("rat"))   或者if(rat.isInstance(pet))

在查询类型信息时,以instanceof的形式(既instanceof或者isInstance()) 与直接比较Class对象有一个很重要的区别。

//如果Deriver是Base的子类 x是Derived类型
x instanceof Base  //true
x instanceof Derived //true
Base.isInstance(x) //true
Derived .isIntance(x) //true

x.getClass()==Base.class //false
x.getClass()==Derived.class//true
x.getClass().equals(Base.class) //false
x.getClass().equals(Derived.class) //true

  instanceof保持类类型的概念,它指的是“你是这个类吗?或者你是这个类的子类吗?” 而如果用==比较实际的Class对象,就没有考虑继承--它是这个确切的类型,或者不是。

    

时间: 2024-08-01 22:47:56

类型信息-RTTI的相关文章

运行时类型信息RTTI

我们在写C++代码的时候经常碰到使用dynamic_cast进行类型转换的情况,也都知道经过dynamic_cast的转换更加安全,因为dynamic_cast进行了类型检查. 但是可能很多人不知道dynamic_cast是C++ 运行时类型信息(RTTI)机制链条上的一个节点. RTTI提供了两个操作符和一个类: dynamic_cast typeid type_info 整个RTTI, 作为一个整体,暴露给程序员的就是这三个元素.因此我们关注的焦点也就在它们身上了. 什么是RTTI 在C++

Thinking in Java -- 类型信息RTTI

Thinking in Java – 类型信息 个人感觉 java 中的比較难的部分了,在看了些netty源代码发现事实上这块很实用. 这章重点是RTTI和反射.先说下自己的理解 RTTI是执行时识别.在c++中是用virtual来实现的,在编译期会忽略对象的详细类型信息,假定我们已经知道,并在执行时详细识别. Java反射机制实在执行状态中,对于随意一个类,都能够知道这个类的全部属性和方法.对于随意一个对象.都能够调用它的随意一个方法和属性,这样的动态获取的信息以及动态调用对 象的方法的功能称

Java编程思想(十四) —— 类型信息RTTI(1)

译者翻译的时候有些奇怪,Runtime type information (RTTI) allows you to discover and use type information while a program is running. 运行时类型信息(原来的翻译没有括号这里面的内容,Runtime type information,简称RTTI,个人觉得这样注释比较好)可以让你在程序运行的时候发现和使用类型信息.后面直接出现RTTI让人疑惑. 1)为什么需要RTTI 之前的多态的例子中: p

了解运行时类型信息(RTTI)

RTTI需要引用单元TypeInfo GetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo.它有四种重载形式,后面三种重载的实现都是调用第一种形式.AKinds 参数用于限制属性的类型,如果得到的 PPropInfo 不属于指定的类型,则返回 nil. function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo; function GetPropInfo(Instance: T

JAVA类型信息——Class对象(转载)

JAVA类型信息--Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. 3.RTTI真正含义:运行时,识别一个对象的类型. 4.如何在程序运行时识别对象和类的信息? 1)传统RTTI:即在编译时已知道了所有的类型. 2)反射机制:在程序运行时发现和使用类的信息. 5.RTTI的使用 import java.util.*;      //List支持泛型 //impor

JAVA RTTI类型信息

RTTI 允许你在程序运行时,发现和使用类型信息. Dynamically bound method :  动态绑定方法. polymorphism: 多态. RTTI的实现原理: Class 对象: 包含了 类的信息.每一个类都有一个 Class 对象.当创建一个类的实例时,jvm会使用 "类加载器"的子系统. ClassLoader:所有的类都是在对其第一次使用时,动态地加载到jvm中的.当程序创建第一个类的静态成员引用时,就会加载这个类. Dynamic Loading: 在ja

C++ - RTTI(RunTime Type Information)执行时类型信息 具体解释

RTTI(RunTime Type Information)执行时类型信息 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24369987 RTTI, RunTime Type Information, 执行时类型信息, 是多态的主要组成部分, 通过执行时(runtime)确定使用的类型, 执行不同的函数,复用(reuse)接口. dynamic_cast<>能够 使基类指针转换为派生类的指针, 通过推断指针的类型

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

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

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

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