“注解”这个词,可谓是在Java编程中出镜率比较高,并且也是一个老生常谈的话题。咱们以前在聊Spring相关的东西时,注解是无处不在,以前咱们简单的聊过一些“注解”的相关内容,好比在Spring中是如何进行“注解”组合的。由于注解在Java编程中仍是比较重要的,因此咱们今天的博客就把注解的东西给系统的介绍一下,固然咱们会依托于具体的实例。编程
“注解”说白了就是存储数据的一种方式,若是注解单拎出来功能也就通常,若是将“注解”与Java的“反射机制”相结合,那么能够作的事情就多了。也就是说,你能够经过反射来读取“注解”提供的信息,而后来根据你的具体需求来作一些事情。固然,以前咱们经常使用XML来为反射机制提供信息,不过“XML”的配置仍是没有“注解”这种数据形式好管理,好维护,因此“注解”的地位仍是比较重要的。测试
下方咱们先聊一下“元注解”,而后在根据这些“元注解”来自定义注解,并使用Java的“反射机制”来读取各类类型的注解信息。spa
1、元注解3d
在本篇博客的第一部分,咱们先来总体的看一下“元注解”,而后下方的内容再根据这些元注解进行展开。对象
一、@Targetblog
使用方式:@Target(ElementType.CONSTRUCTOR)继承
@Target注解是比较重要的,Target的中文是“目标、位置”的意思,见名知意。@Target就用来声明咱们建立的注解所放置的位置,也就是咱们所建立的注解能够修饰什么样的元素。@Target的参数是一个ElementType的枚举,每一个枚举项表明着一个位置。下方就是几个ElementType枚举比较经常使用的值:接口
TYPE: 类,若是@Target的参数是TYPE,那么咱们建立的这个注解只能修饰类、接口、枚举等这些类型上。
FIELD: 字段修饰,若是咱们的自定义注解是FIELD类型的话,那么咱们的注解只能用来修饰类或者枚举的字段,也就是成员变量。
CONSTRUCTOR:构造器类型,该类型的“注解”只能修饰构造器。
METHOD:修饰“方法”的注解。
PARAMETER:修饰“方法”中的参数的注解。
LOCAL_VARIABLE: 修饰“局部变量”的注解。
固然,上面是简单一聊,下方会给出上述类型注解的具体实例。下面截图是ElementType中全部的选项以及每一个枚举值的做用。具体以下所示,下方两个是1.8后新加的枚举项,以下所示:作用域
二、@Retention字符串
使用方式:@Retention(RetentionPolicy.RUNTIME)
上面是@Retention的使用方式,Retention的中文意思是“保留”,也就是说该元注解给出了“注解”的保留周期。@Retention也是接收一个枚举类型的参数,下方就是该枚举所包含的类型。下方的英文注释已经具体的给出了每一个枚举项所对应的意思。
SOURCE:说明咱们的注解只会留在咱们的源码中,并不会被编译。
CLASS: 说明咱们的注解会被编译成字节码存储到 .class文件中,但不会在虚拟机中连接运行。
RUNTIME:这个就说明咱们的注解会一直保留到程序的运行时,若是你想在运行时根据注解的信息经过反射机制作一些事情的话,那么必须得将咱们的注解保留到这一阶段。
三、@Document与@Inherited
这两个注解就比较简单了,@Document说明将此注解包含在Javadoc中,而@Inherited则表示,该注解能够被子类继承。
上述的介绍可能会有些抽象,接下来我咱们就根据实例,利用反射机制来操做相应类型的自定义注解。
2、测试用例介绍
下方截图是本篇博客所涉及Demo的目录以及主要的操做类。
AnnotationTracker:该类负责经过Java的“反射机制”来获取相应类型的注解的对象以及注解中的相关信息。在AnnotationTracker的类中,全是静态方法,静态方法传入的是相关注解修饰的Class。大致结构以下所示。
CE… Annotation:这些类是不一样类型的注解,稍后咱们会详细讨论。
TestClass:该类是注解所修饰的测试类。
Main:咱们本Demo的测试用例的执行方法。
3、类型注解:@Target(ElementType.TYPE)
接下来,咱们来看一下类型注解的建立与使用。下方内容咱们下建立一个修饰类型的注解,而后再相关类中添加上该注解的修饰,最后使用Java的反射机制来获取相应的注解信息。
一、建立注解
首先建立咱们的注解,具体步骤以下所示,选择Annotation后键入注解名点击回车便可。
下方代码段就是所建立注解中的详细内容。咱们能够看出@Target元注解的参数是ElementType.TYPE类型的。也就是说明咱们建立的这个注解是修饰类型的注解,能够做用域类、接口、枚举等类型。而后咱们还看到@Retention的参数是RetentionPolicy.RUNTIME类型的,说明该注解一直被保留到运行时。
注解是使用@Interface来声明的,这与接口的什么相似。@Interface后方跟着的就是注解的名称,本注解的名称为CETypeAnnotation。其中有一个公有的(public)整数(int)类型的id属性。该属性的默认值是0,具体以下所示。
二、注解的使用
下方代码段是对上述注解的使用。由于上述建立的注解是ElementType.TYPE类型的,因此咱们就用该注解来修饰咱们建立的一个类,也就是下方的TestClass。在注解修饰时,咱们给id设置了一个值,也就是下方的id = 10。
三、使用反射获取修饰类型注解的相关信息
接下来,咱们就要在AnnotationTracker类中添加利用Java的“反射机制”来获取相应的TestClass类的注解的相关信息了,关键代码以下所示。trackTypeAnnotation()方法的参数是一个Class类型,而后能够经过Class的getAnnotation()方法来获取相应类中的注解对象。以下方的红框所示。
获取完相应的注解对象后,咱们就能够获取到相应注解中的配置信息了。
四、测试用例以及测试结果
接下来咱们就在Main方法中来调用AnnotationTracker类中的上述方法,并传入TestClass,以下所示。下方是其打印结果。
4、其余类型的注解
上述咱们详细的聊了ElementType.TYPE类型的注解,接下来咱们来看一下其余类型的注解,以及这些注解的使用方式。
一、@Target(ElementType.CONSTRUCTOR)
接下来咱们来建立一个修饰构造器的注解。下方的CEConstructorAnnotation就是咱们建立的用来修饰类构造器的注解。其中的value字段的默认值是一个空字符串。
二、@Target(ElementType.FIELD)
接下来咱们就来建立一个修饰字段的注解,咱们将该字段命名为CEFieldAnnotation,具体代码以下所示:
三、@Target(ElementType.METHOD)
下方是咱们建立的修饰方法的注解,咱们将其命名为CEMethodAnnotation,具体代码以下所示。
四、@Target(ElementType.PARAMETER)
下方是修饰方法中参数的注解,咱们将其命名为,以下所示:
5、上述相关注解的使用
下方就是上述所定义的各类类型的注解的使用方式,各司其职。具体就不作过多赘述了。
6、使用反射机制获取不一样类型的注解信息
以前咱们已经聊了如何使用“Java”的反射机制来获取相关注解的信息,下方咱们将会分别获取上述各类类型的注解的相关信息。下方代码主要是AnnotationTracker中的相关代码。
一、获取修饰构造器类型的注解信息
二、获取修饰方法和方法参数的注解信息
三、获取修饰字段的注解信息
四、测试用例以及输出结果
今天的博客就先到这儿吧,下篇博客仍然会更新Java相关的博客。