“注解”这个词,可谓是在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文件中,但不会在虚拟机中链接运行。

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反射 注解_Java反射中的注解相关推荐

  1. android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术

    本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术.初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习.下面是个人的总结 拉勾IT课小编为大 ...

  2. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  3. java 解析注解_Java知识点总结(注解-解析注解)

    Java知识点总结(注解-解析注解) @(Java知识点总结)[Java, 注解] 通过反射获取类.函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑. 使用注解步骤: 定义注解 类中使用注 ...

  4. java 反射 工厂_JAVA反射机制、工厂模式与SPRING IOC

    ABSTRACT Spring的IOC(控制反转)是Spring框架的灵魂,有了它才有了Spring的很多其他的灵活的特性.使用 Spring 开发项目时,控制层.业务层.DAO 层都是通过 IoC ...

  5. java 枚举 注解_Java枚举类和注解梳理

    1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...

  6. java 求正割_Java 反射机制详解

    动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ru ...

  7. java path 注解_Java内置系统注解和元注解

    第一节:注解(Annotation)的作用 Annotation(注解)是JDK5.0及以后版本引入的.它的作用是修饰程序元素.什么是程序元素呢?例如:包.类.构造方法.方法.成员变量等. 注解,就是 ...

  8. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  9. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

最新文章

  1. 语雀图片与七牛云之间的迁移同步
  2. CentOS6.x配置tomcat搭建JSP应用服务器
  3. 网久环境服务启动命令
  4. xcode5 delete provisioning profile
  5. 1349. 修理牛棚【难度: 中 / 思维 贪心】
  6. 关于「Xception」和「DeepLab V3+」的那些事
  7. 【图像处理面试题】——1
  8. [WP] 关于页面切换动画 记录
  9. java list应用_java中list集合的应用
  10. 视频教程-路由技术(CCNA魔鬼训练营系列)-思科认证
  11. 老男孩Python高级全栈开发工程师【高清全套完整】
  12. 毕业论文 | 文献综述应该怎么写
  13. 小米3手机无法打开WLAN ,WIFI 的解决方法,不需刷机
  14. PCL库中I/O操作
  15. SAP MM之移动类型(Movement type-MVT)_小七_新浪博客
  16. YYC采集工具python语言精简方便实用的视频采集工具
  17. Transformer时序预测
  18. 如何推广你的区块链初创企业,顺利完成ICO及后续发展
  19. 机器视觉、模式识别库
  20. 一套MES系统需要多少钱?如何使生产管理系统标准化?

热门文章

  1. NMS(非极大值抑制)的python,cpu,gpu实现
  2. Xerces使用指南
  3. 18135usm_更快更安静 佳能18-135mm USM镜头解析
  4. 安全散列算法(SHA、SHA1)简述
  5. 计算机主机拆废品,废旧笔记本别再当废品卖掉了!简单拆开件件都是宝物!
  6. 线性时间选择(C++)
  7. python爬虫逆向|某手网页滑块逆向分析
  8. 重庆大学c语言期末考试试卷,重庆大学网院2018年C语言程序设计 ( 第3次 )答案参考...
  9. JVM学习02——内存加载过程(类加载器)
  10. JavaScript中for循环嵌套编程小案例