DBMNG数据库管理与应用

独立思考能力,对于从事科学研究或其他任何工作,都是十分必要的。
当前位置:首页 > MySQL > 常见问题

在运行时使用反射获取注解(1)

12.4.3 在运行时使用反射获取注解(1)

尽管设计注解的目的主要是用于其他的开发和部署工具,但是如果为注解指定RUNTIME保留策略,那么任何程序在运行时都可以使用反射来查询注解。反射是能够在运行时获取类相关信息的特性。反射API位于java.lang.reflect包中。使用反射的方式有很多,在此不可能解释所有这些方式。但是,我们将分析应用了注解的几个例子。

使用反射的第一步是获取Class对象,表示希望获取其中注解的类。Class是Java的内置类,是在java.lang包中定义的。在本书第Ⅱ部分将对这个包进行详细介绍。可以使用多种方式来获取Class对象。其中最简单的方式是调用getClass()方法,该方法是由Object类定义的,它的一般形式如下所示:

  1. final Class<?> getClass( )  

该方法返回用来表示调用对象的Class对象。

注意:

注意上面显示的getClass()方法声明中跟在Class后面的<?>,这与Java中的泛型特性有关。在本章讨论的getClass()方法以及其他几个与反射有关的方法,需要使用泛型。泛型将在第14章介绍。但是,理解反射的基本原则不需要先理解泛型。

获得Class对象后,可以使用其他方法获取与类声明中各个条目相关的信息,包括注解。如果希望获取与类声明中特定条目关联的注解,那么首先必须获取表示该特定条目的对象。例如,Class提供了getMethod()、getField()以及getConstructor()方法(还有其他方法),这些方法分别获取与方法、域变量以及构造函数相关的信息,这些方法返回Method、Field以及Constructor类型的对象。

为了理解这个过程,分析一个获取与方法关联的注解的例子。为此,首先获取表示类的Class对象,然后调用Class对象的getMethod()方法并指定方法的名称。getMethod()方法的一般形式如下:

  1. Method getMethod(String methName, Class<?> ... paramTypes) 

方法的名称被传递到methName中。如果方法有参数,那么必须通过paramTypes指定表示这些参数类型的Class对象。注意paramTypes是可变长度参数,这意味着可以指定需要的任意多个参数,包括指定0个参数。getMethod()方法返回表示方法的Method对象。如果没有找到方法,就抛出NoSuchMethodException异常。

对Class、Method、Field以及Constructor对象调用getAnnotation()方法,可以获得与对象关联的特定信息。该方法的一般形式如下:

  1. <A extends Annotation> getAnnotation(Class<A> annoType) 

其中,annoType是表示您感兴趣注解的Class对象。该方法返回对注解的一个引用,使用这个引用可以获取与注解成员关联的值。如果没有找到注解,该方法会返回null。如果注解的保留策略不是RUNTIME,就会出现这种情况。

下面的程序总结了在前面介绍的所有内容,并使用反射显示与某个方法关联的注解:

 
该程序的输出如下所示:
  1. Annotation Example 100 

本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号