类型信息-RTTI
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类型信息-RTTI相关的知识,希望对你有一定的参考价值。
运行时类型信息使你可以在程序运行时发现和使用类型信息
主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型,另一种是反射机制,它允许我们在允许时发现和使用类的信息。
- 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的主要内容,如果未能解决你的问题,请参考以下文章