本文内容:

  • 注解Annotation的介绍
  • 基本注解的用法
  • 自定义注解

首发日期:2018-07-28


注解Annotation的介绍

  • Annotation是代码中的特殊标记,能够在编译、类加载、运行时被识别(需要设置),并根据不同的Annotation来执行不同的处理。
  • Annotation可以修饰包、类、构造器、函数、成员变量、局部变量的声明、参数等程序元素。Annotation帮助这些元素来设置元数据,程序从元数据中获取信息来处理这些元素。

元数据可以描述代码间关系或者代码与其它资源的关系,比如说在web.xml中需要将请求路径跟处理请求的servlet对应起来,比如说在Hibernate中需要.hbm文件来描述实体类与数据表之间的映射关系。元数据可以提供某些信息来协助我们程序的运行。

在Java中,Annotation就可以帮我们在代码层面上去设置元数据,而不必需要去使用一些例如web.xml的文件来描述。


基本注解的用法

如何使用注解修饰元素:

  • 通常来说,在修饰目标的上一行进行注解,比如。修饰成员变量也是如此。

常用的基本的Annotation:

@Override :指明下面修饰的函数必须是重写父类的函数的函数,如果修饰的函数不在父类中存在,那么会报错。

@Deprecated :标明函数、类等元素已过时,效果是在使用已经过时的元素时会警告。

@SuppressWarnings:抑制修饰的元素发生警告(warning),效果是修饰过后,编译器不会提示警告。

@SafeVarargs【Java7新增】:如果把一个没有定义泛型的集合,赋给一个有定义泛型的集合,会发生堆污染,会报错。@SafeVarargs可以抑制这个报错。

@FunctionalInterface【Java8新增】:用来限制修饰的接口必须是一个函数式接口,不然会报错。

元Annotaion:修饰注解的注解

  • @Retention:指定Annotation的保留方式,保留方式不同,会影响能被使用的位置。比如如果需要通过反射获取信息,那么应该允许运行时还能获取。
    • @Retention(RetentionPolicy.CLASS):默认值,代表把注解留在class文件中,程序运行后,JVM将无法获取注解。【由于里面的成员变量名为value,所以可以省去 参数名="xxx",如果不是value,那么不可以省去!】
    • @Retention(RetentionPolicy.RUNTIME):代表把注解留在class文件中,程序运行后,JVM可以通过反射来获取注解。
    • @Retention(RetentionPolicy.SOURCE):只留在源代码中,JVM不会获取到注解。
  • @Target:限制Annotaion能修饰哪些元素
    • @Target(ElemenetType.ANNOTATION_TYPE):指定被修饰的Annotaion只能用来修饰Annotaion
    • @Target(ElemenetType.FIELD):指定被修饰的Annotaion只能用来修饰成员变量
    • @Target(ElemenetType.CONSTRUCTOR):指定被修饰的Annotaion只能用来修饰构造器
    • @Target(ElemenetType.METHOD):指定被修饰的Annotaion只能用来修饰函数
    • @Target(ElemenetType.LOCAL_VARIABLE):指定被修饰的Annotaion只能用来修饰局部变量
    • @Target(ElemenetType.PACKAGE):指定被修饰的Annotaion只能用来修饰包
    • @Target(ElemenetType.PARAMETER):指定被修饰的Annotaion只能用来修饰参数
    • @Target(ElemenetType.TYPE):指定被修饰的Annotaion只能用来修饰类、接口(包括注解类型)或枚举定义
  • @Documented:指定Annotaion是否能包含到javadoc生成的文档中。
  • @Inherited:指定Annotaion具有继承性,父类定义了这个注解,那么子类也会继承这个注解。

自定义注解

  • 自定义注解跟定义接口差不多,在interface的基础上加一个@

  • 当就是这么空,不写东西的时候,是一个标记型的注解,标记型的注解功能比较简单,通常只能用来标记特殊的元素从而进行处理。比如Override就是一个标记型的注解。
  • 注解可以定义成员变量,这些成员变量以声明无形参函数的形式存在,返回值是变量的类型,函数名是变量的名字。注解上定义的成员变量只能是String、数组、Class、枚举类、注解。成员变量可以提供更多的元数据信息。

定义了成员变量后,在使用的时候需要给成员变量赋值(成员变量名为value时,可以省去value="xxx",但是这个名字时,不可以省略)。在没有成员变量时,可以单写注解名,要赋值时就要用上括号。

  • 如果某些成员变量不需要每次都赋值,可以给它设置默认值。成员变量可以有默认值,在变量的后面加上default 默认值.

注解处理器:

对于Java自带的注解,Java有自己的注解处理器去处理。但自定义的注解,需要自己去定义注解处理器,自己去调用注解处理器去处理。所以,注解处理器本质上也是一个普通函数,不过它的工作主要是处理注解罢了。

在学会怎么定义注解处理器之前先了解几个前置知识:

  • 所有注解的父接口都是Annotation。
  • 一个注解,只有它的存在时间足够我们才能使用它,所以如果我们想使用注解处理器,注解首先需要使用@Retention(RetentionPolicy.RUNTIME)修饰。
  • java.lang.reflect包中存在一些能够实现反射功能的工具类。
  • java.lang.reflect包中有一个AnnotationElement接口,它声明了一系列可以获取注解的函数,并且它有几个实现类,如下所见,所以你可以在类、构造函数等对象中调用声明好的函数来获取注解。
    • getAnnotation(注解.class):获取对应类型的注解
    • getAnnotations():获取所有注解
    • getDeclaredAnnotations():获取直接注解,忽略继承过来的注解。
    • isAnnotationPresent(注解.class):判断对应类型的注解是否存在

获取注解:

....其他对象就演示了。

操作注解:通常来说,都是处理注解带上的信息。

小例子

不知道你有没有了解过org.junit.Test这个东西,这个可以让你直接运行你想要运行的函数(可以称为单元测试?)。而不需要你创建一个main()去调用。

下面做一个示例,来实现类似的功能:

1.创建注解:

2.使用注解:

3.调用注解处理器:【这里使用了org.junit.Test来调用,你也可以在main()中调用!】

结果是:

补充:

  • 上面的小例子中并没有使用注解的成员变量,但事实上,使用成员变量也同样只是获取里面的信息来做更多处理罢了,这就依靠个人去应用了。

Java:注解Annotation(元数据)的更多相关文章

  1. Java注解(Annotation)详解

    转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...

  2. Java - 注解 (Annotation)

    Java - 注解 (Annotation)   一.基本的 Annotation     > 使用 Annotation 时要在其前面增加 @符号,并把该 Annotation 当成一个修饰符 ...

  3. Java注解Annotation(一)

    Java注解Annotation(一)——简介 这一章首先简单介绍一下注解,下一章会给出一个注解应用的DEMO. 1. 元注解 元注解的作用是负责注解其他的注解. JDK1.5中,定义了4个标准的me ...

  4. Java注解Annotation与自定义注解详解

    Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识 ...

  5. 深入JAVA注解-Annotation(学习过程)

    JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...

  6. 深入学习JAVA注解-Annotation(学习过程)

    JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...

  7. java注解Annotation

    扯扯注解的蛋 为什么学习注解?学习注解有什么好处?学完能做什么? 1.能够读懂别人的代码,特别是框架相关的代码 2.让编程更加简洁,代码更加清晰 3.让别人高看你一眼 注解是java1.5引入的 概念 ...

  8. Java注解Annotation详解

    从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通过使用Annotation,开发人员可 ...

  9. java注解--Annotation

    Annotation(注释) 概述 从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注释) Annotation 其实就是代码里的特殊 ...

  10. 秒懂,Java 注解 (Annotation)你可以这样学 - CSDN博客

    https://blog.csdn.net/briblue/article/details/73824058 文章开头先引入一处图片. 这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我个人比较 ...

随机推荐

  1. 解决添加codova plugin 编译出现问题:Execution failed for task ':processDebugManifest'.

    问题背景: ionic3项目上,添加cordova-plugin-cszbar,编译运行在android平台上 ,结果编译不成功.出现以下问题. Element uses-feature#androi ...

  2. 04 Tensorflow的中的常量、变量和数据类型

    打开Python Shell,先输入import tensorflow as tf,然后可以执行以下命令. Tensorflow中的常量创建方法: hello = tf.constant('Hello ...

  3. web进修之—Hibernate 类型(4)

    本片包含Hibernate的两种类型的简单介绍和集合类型的映射. Hibernate中的两种类型: Entity 自己掌控自己的生命周期,比如Person有addrss属性(关联到另外一张表).age ...

  4. 开始翻译Disruptor

    刚开始接触Disruptor,看了作者的博客,发现这个大牛很与众不同,他不仅讲解自己的框架的设计思想,还深度介绍了这样设计的原因,其知识范围涵盖了操作系统.数据结构.计算机组成,很有学习的价值.网上有 ...

  5. 依赖倒置原则(DIP)

    什么是依赖倒置呢?简单地讲就是将依赖关系倒置为依赖接口,具体概念如下: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象(父类不能依赖子类,它们都要依赖于抽象类) 2.抽象不能依赖于具体,具体 ...

  6. #19 re&jieba模块

    前言 在Python中,需要对字符串进行大量的操作,有时需要从一个字符串中提取到特定的信息,用切片肯定是不行的,所有这一节记录两个强大的文本处理模块,一个是正则表达式re模块,另一个是中文处理模块ji ...

  7. python工程遇到的错误

    1.SyntaxError: Non-ASCII character '\xe5' in file D:\eclipseworkspace\test\test_urllib2.py on line2 ...

  8. jquery发起get/post请求_或_获取html页面数据

    备注:我们经常会遇到使用jquery获取某个地址下的部分页面内容,然后替换当前页面对应内容,也就是:局部刷新功能. 当然也可以使用get/post请求获取数据,修改数据,可以参考以下JS代码: 走过的 ...

  9. 微信小程序实现支付功能

    小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...

  10. nginx 日子配置

    nginx access_log nginx 日志说明 不同用户防卫Nginx会把每个用户访问往咱的日志信息记录到指定的日志文件里,供网站管理员分析用户浏览行为等,此功能又ngx_http_log_m ...