当我们把一个对象装入容器之中其就会失去自己的类型,当取出来的在作为原来类型使用的时候需要强转,这就是一中运行期类别是别的表现。java中总共的表现有三种形式:强转,Class对象,和instanceof方法。
强转刚才已经说过。
Class对象
Class对象就是保持了类型信息的对象。当一个类加载之后就会产生一个Class对象,为了得到这个Class对象的引用我们可以有如下的方式:
- Class.forName()方法。这种方式有个弊端,就是参数必须是全路径名的类名,这样就很容易出错,还必须做异常处理。
- 类字面常量ClassA.class,int.class。
看一个例子,是用来数宠物的数目,我们能得到很多类型识别使用的方法。
在数的时候,会有如下的特征:
- 可以使用A.class.isInstance(a)的方式,来表达a是ClassA是实例,另外还可以使用 a instanceof A来判断a是否是A类型但是使用instanceof判断的时候,就不能使用遍历的循环方式了。
- 判断的时候会把子类的对象也认识是父类型的。
反射
我们使用Class的功能是,除了用于判断类型外,主要是为了得到类型中的属性和方法,以控制这些方法。
另外反射也是写框架所必备的技术,像struts等框架中大量的使用了这种技术。
反射中涉及的方法比较多,看例子:
能够判断是否是接口,能够得到父类,能够得到类型的属性,还能够引用类型的方法等等。
annotation 注释
在java1.5之后,加入了注释功能,是一种元数据的描述方式。主要起到修饰的作用。可以修饰方法,变量等等,本身加载程序上不会有作用,需要有配套的工具类来进行使用。比如现在最新的hibernate中就有对应的注释能够标注bean与数据库字段的对应关系,通过hibernate来使用这些注释。
在创建自己的注释之前,我们先看一下java的内建注释。
@deprecated。表示过时。
@override表示此方法覆盖了父类的方法,编译器应该通过这个注释判断是否有覆盖行为发生,没有给出编译提示。
当然还有很多其他的内容,这里只是给出了例子。
annotation本身是一种特殊的接口,我们可以创建自己的注释,看一个例子,我们来创建一个约束日期格式的注释,然后使用反射来提示这一点。
注意创建自己的注释的时候也可以用内建的注释进行修饰。代码中已经有说明。注释还有很多比较高级的使用,这里不进行详述,如果有机会讨论写一个自己的框架的话,在详细的讨论复杂的反射的使用。