类型信息

  类型信息是指,类的信息。在编程中,一种是面向类型编译,类型在编译时已确定;一种是运行时面向类型,是不知道具体类型的。比如面向接口编程,你只知道范化的接口是做什么的,不知道它的具体实现。这个时候就要用到类型识别RTTI(运行时类型识别)完成。

  在Java中识别类和对象的信息主要有两种:一种是传统的RTTI,它假定在编译时已经知道类型;一种是“反射”,它允许我们在运行时发现使用类的信息。

   

    这是一个多态的例子,List集合是以基类Shape作为存储元素的,这个时候存储的具体元素会“向上转型”为基类存储,但是这个数组容器实际是把所有的元素当做Object来持有的,当你取出时会“自动转型”为Shape,这是RTTI的一种体现(转型),运行时识别对象类型。

  在Java中,每个类默认都有一个Class对象,它包含了类的有关信息,Java就是用它来执行RTTI的。

  Class总是指向目标Class对象的,它可以获取类的信息,制造该类的实例。因此Class表示的就是它所指向的确切类型。

  要理解RTTI在Java中的工作原理,必须知道类型信息在运行时是如何表示的。类是程序的一部分,为了生成这个类的对象,Java虚拟机将使用“类加载器”进行加载。所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态调用时,会主动加载这个类。类加载器首先检查这个类的Class对象是否已加载。如果未加载,默认类加载器会根据类名加载.class文件,在这个类被加载时,它会对这个文件进行验证,以确保其没有被破坏,一旦加载入内存,它就被用来创建这个类的所有对象。有关更多JVM的了解,请查绚相关资料。

  无论何时,只要你想在运行时使用类型信息,就必须先获得该类Class对象的引用。获取Class对象的方式有两种,Class.forName("包名+类名")、类.class。这两种是有区别的,第一种会使类强行初始化部分,.class不会。例如:

  

static初始化是在类加载器进行加载时初始化,.class不会执行执行初始化的动作。需要注意,.class对类的常量的使用也是不会触发初始化。

  RTTI的实现是通过Class对象去做的,有关Class的一些操作和理解过几天补全。

原文地址:https://www.cnblogs.com/liaobudao/p/11234552.html