“注解”这个词,可谓是在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后新加的枚举项,如下所示:

  

2、@Retention

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

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

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

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

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

  

3、@Document与@Inherited

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

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

二、测试用例介绍

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

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

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

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

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

  

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

接下来,我们来看一下类型注解的创建与使用。下方内容我们下创建一个修饰类型的注解,然后再相关类中添加上该注解的修饰,最后使用Java的反射机制来获取相应的注解信息。

1、创建注解

首先创建我们的注解,具体步骤如下所示,选择Annotation后键入注解名点击回车即可。

  

下方代码段就是所创建注解中的详细内容。我们可以看出@Target元注解的参数是ElementType.TYPE类型的。也就是说明我们创建的这个注解是修饰类型的注解,可以作用域类、接口、枚举等类型。然后我们还看到@Retention的参数是RetentionPolicy.RUNTIME类型的,说明该注解一直被保留到运行时。

注解是使用@Interface来声明的,这与接口的什么类似。@Interface后方跟着的就是注解的名称,本注解的名称为CETypeAnnotation。其中有一个公有的(public)整数(int)类型的id属性。该属性的默认值是0,具体如下所示。

  

2、注解的使用

下方代码段是对上述注解的使用。因为上述创建的注解是ElementType.TYPE类型的,所以我们就用该注解来修饰我们创建的一个类,也就是下方的TestClass。在注解修饰时,我们给id设置了一个值,也就是下方的id = 10。

  

3、使用反射获取修饰类型注解的相关信息

接下来,我们就要在AnnotationTracker类中添加利用Java的“反射机制”来获取相应的TestClass类的注解的相关信息了,关键代码如下所示。trackTypeAnnotation()方法的参数是一个Class类型,然后可以通过Class的getAnnotation()方法来获取相应类中的注解对象。如下方的红框所示。

获取完相应的注解对象后,我们就可以获取到相应注解中的配置信息了。

  

4、测试用例以及测试结果

接下来我们就在Main方法中来调用AnnotationTracker类中的上述方法,并传入TestClass,如下所示。下方是其打印结果。

  

四、其他类型的注解

上述我们详细的聊了ElementType.TYPE类型的注解,接下来我们来看一下其他类型的注解,以及这些注解的使用方式。

1、@Target(ElementType.CONSTRUCTOR)

接下来我们来创建一个修饰构造器的注解。下方的CEConstructorAnnotation就是我们创建的用来修饰类构造器的注解。其中的value字段的默认值是一个空字符串。

  

2、@Target(ElementType.FIELD)

接下来我们就来创建一个修饰字段的注解,我们将该字段命名为CEFieldAnnotation,具体代码如下所示:

  

3、@Target(ElementType.METHOD)

下方是我们创建的修饰方法的注解,我们将其命名为CEMethodAnnotation,具体代码如下所示。

  

4、@Target(ElementType.PARAMETER)

下方是修饰方法中参数的注解,我们将其命名为,如下所示:

  

五、上述相关注解的使用

下方就是上述所定义的各种类型的注解的使用方式,各司其职。具体就不做过多赘述了。

  

六、使用反射机制获取不同类型的注解信息

之前我们已经聊了如何使用“Java”的反射机制来获取相关注解的信息,下方我们将会分别获取上述各种类型的注解的相关信息。下方代码主要是AnnotationTracker中的相关代码。

1、获取修饰构造器类型的注解信息

  

2、获取修饰方法和方法参数的注解信息

  

3、获取修饰字段的注解信息

  

4、测试用例以及输出结果

  

今天的博客就先到这儿吧,下篇博客仍然会更新Java相关的博客。

转载于:https://www.cnblogs.com/ludashi/p/6758115.html

Java编程之反射中的注解详解相关推荐

  1. java 反射 参数 注解_Java编程之反射中的注解详解

    "注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解&quo ...

  2. java jtable组件_java中jtable组件详解实例

    java中jtable组件详解实例 java 表格控件 JTable 常用操作详解 JTable 是 Swing 编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一 ...

  3. java 自定义正则表达式_java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...

  4. java编程里的values怎么使用,详解Java编程中super关键字的用法

    这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...

  5. java jpa注解哪个包好,Spring Data JPA 中常用注解详解

    一.java对象与数据库字段转化 @Entity:标识实体类是JPA实体,告诉JPA在程序运行时生成实体类对应表 @Table:设置实体类在数据库所对应的表名 @Id:标识类里所在变量为主键 @Gen ...

  6. Spring中@Value注解详解

    在spring项目中必不可少的就是读取配置文件,那么读取配置文件就有两种方式.一种就是使用Spring中@Value注解,还有一种是使用SpringBoot中的@ConfigurationProper ...

  7. 【Java编程进阶】封装继承多态详解

    推荐学习专栏:Java 编程进阶之路[从入门到精通] 文章目录 1. 封装 2. 继承 2.1 继承的语法 2.2 子类重写父类的方法 2.3 子类隐藏父类的方法 2.4 super 关键字 2.5 ...

  8. Java持久层框架MyBatis全注解详解

    org.apache.ibatis.annotations包下有着 mybatis 所有的注解,让我们一文打尽! 1 @Mapper MyBatis映射器的标记接口 从mybatis3.4.0开始加入 ...

  9. java static int a_java中static作用详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

最新文章

  1. Python Qt GUI设计:QSpinBox计数器类(基础篇—15)
  2. autoconf和automake的安装与使用
  3. item 24: 区分右值引用和universal引用
  4. “扎金花FANS”进行了改进
  5. linux内核工程师必须知道的三十道题
  6. 首届“马栏山杯”国际音视频算法优化大赛颁奖盛典暨高峰论坛圆满落幕
  7. 二叉树最 前序、中序、后序、层序遍历(最终)
  8. 「leetcode」40.组合总和II【回溯算法】详解!
  9. 如何看数据库是否处在force_logging模式下
  10. 初学QTP系列视频教程
  11. matlab cic设计,CIC滤波器设计
  12. 分布式 HTAP 数据库 ADB PG 架构解析
  13. 【巨人的肩膀上制造世界】——10——Unity3D实用插件之Vectrosity,轻松便捷的实现2D/3D画线功能
  14. 克转换成千克怎么算python_如何在Python中将磅转换为千克
  15. 定积分问题的区间再现公式应用
  16. 易协软件:workflow与BPM区别
  17. PHP系列之集成Ajax实现登录验证
  18. 10000多套机械手毕业设计 课程设计 毕业论文 图纸 分享/上下料机械手、搬运机械手、苹果采摘机械手、液压机械手、三自由度机械手、水果采摘机械手、六自由度机械手、焊接机械手、码垛机械手、四自由……
  19. 输入框禁止输入emoji表情
  20. OAuth2:单点登陆客户端

热门文章

  1. 最全面的几何画板实用教程视频免费下载
  2. VC连接mysql数据库错误:libmysql.lib : fatal error LNK1113: invalid machine 解决方法
  3. Spring Boot 与 Java 对应版本,以下表格由官方网站总结。
  4. 如何快速掌握一门新技术/语言/框架
  5. 探测与响应是各企业机构在2017年的首要安全事务
  6. 【学神】1-4 用户及用户组管理
  7. 【BZOJ】1649: [Usaco2006 Dec]Cow Roller Coaster(dp)
  8. 微软Visual Studio 14 CTP 2 发布
  9. 【pl/sql番外篇】 存储过程 游标
  10. Etherchannel的配置 三层