Java编程之反射中的注解详解

注解”这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题。我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些“注解”的相关内容,比如在Spring中是如何进行“注解”组合的。因为注解在Java编程中还是比较重要的,所以我们今天的博客就把注解的东西给系统的介绍一下,当然我们会依托于具体的实例。

“注解”说白了就是存储数据的一种方式,如果注解单拎出来功能也就一般,如果将“注解”与Java的“反射机制”相结合,那么可以做的事情就多了。也就是说,你可以通过反射来读取“注解”提供的信息,然后来根据你的具体需求来做一些事情。当然,之前我们常用XML来为反射机制提供信息,不过“XML”的配置还是没有“注解”这种数据形式好管理,好维护,所以“注解”的地位还是比较重要的。

下方我们先聊一下“元注解”,然后在根据这些“元注解”来自定义注解,并使用Java的“反射机制”来读取各种类型的注解信息

一、元注解

在本篇博客的第一部分,我们先来整体的看一下“元注解”,然后下方的内容再根据这些元注解进行展开。

1、@Target

使用方式:@Target(ElementType.CONSTRUCTOR)

@Target注解是比较重要的,Target的中文是“目标、位置”的意思,见名知意。@Target就用来声明我们创建的注解所放置的位置,也就是我们所创建的注解可以修饰什么样的元素。@Target的参数是一个ElementType的枚举,每个枚举项代表着一个位置。下方就是几个ElementType枚举比较常用的值:

TYPE: 类,如果@Target的参数是TYPE,那么我们创建的这个注解只能修饰类、接口、枚举等这些类型上。

FIELD: 字段修饰,如果我们的自定义注解是FIELD类型的话,那么我们的注解只能用来修饰类或者枚举的字段,也就是成员变量。

CONSTRUCTOR:构造器类型,该类型的“注解”只能修饰构造器。

METHOD:修饰“方法”的注解。

PARAMETER:修饰“方法”中的参数的注解。

LOCAL_VARIABLE: 修饰“局部变量”的注解。

当然,上面是简单一聊,下方会给出上述类型注解的具体实例。下面截图是ElementType中所有的选项以及每个枚举值的作用。具体如下所示,下方两个是1.8后新加的枚举项,如下所示:

  

Java编程之反射中的注解详解

2、@Retention

使用方式:@Retention(RetentionPolicy.RUNTIME)

上面是@Retention的使用方式,Retention的中文意思是“保留”,也就是说该元注解给出了“注解”的保留周期。@Retention也是接收一个枚举类型的参数,下方就是该枚举所包含的类型。下方的英文注释已经具体的给出了每个枚举项所对应的意思。

SOURCE:说明我们的注解只会留在我们的源码中,并不会被编译。

CLASS: 说明我们的注解会被编译成字节码存储到.class文件中,但不会在虚拟机中链接运行。

RUNTIME:这个就说明我们的注解会一直保留到程序的运行时,如果你想在运行时根据注解的信息通过反射机制做一些事情的话,那么必须得将我们的注解保留到这一阶段。

  

Java编程之反射中的注解详解

3、@Document与@Inherited

这两个注解就比较简单了,@Document说明将此注解包含在Javadoc中,而@Inherited则表示,该注解可以被子类继承。

上述的介绍可能会有些抽象,接下来我我们就根据实例,利用反射机制来操作相应类型的自定义注解。

二、测试用例介绍

下方截图是本篇博客所涉及Demo的目录以及主要的操作类。

AnnotationTracker:该类负责通过Java的“反射机制”来获取相应类型的注解的对象以及注解中的相关信息。在AnnotationTracker的类中,全是静态方法,静态方法传入的是相关注解修饰的Class。大体结构如下所示。

CE…Annotation:这些类是不同类型的注解,稍后我们会详细讨论。

TestClass:该类是注解所修饰的测试类。

Main:我们本Demo的测试用例的执行方法。

  

Java编程之反射中的注解详解

三、类型注解:@Target(ElementType.TYPE)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f23f41cbad374087c95ca60d9ebf76fe.html