码迷,mamicode.com
首页 > 其他好文 > 详细

类型信息-RTTI

时间:2017-08-28 21:50:04      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:als   并且   表示   tcl   方式   文本   extends   比较   根据   

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

主要有两种方式:一种是传统的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

标签:als   并且   表示   tcl   方式   文本   extends   比较   根据   

原文地址:http://www.cnblogs.com/linhaotown/p/7442167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!