类型信息-RTTI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类型信息-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对象,就没有考虑继承--它是这个确切的类型,或者不是。

 

    

以上是关于类型信息-RTTI的主要内容,如果未能解决你的问题,请参考以下文章

类型信息-RTTI

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

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

JAVA RTTI类型信息

类型信息(反射,RTTI)

C 语言Struct 实现运行类型识别 RTTI