Java:注解Annotation(元数据)


本文内容:

  • 注解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(元数据)

原文地址:https://www.cnblogs.com/progor/p/9380445.html

时间: 2024-11-03 22:04:25

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

JAVA注解Annotation

JAVA注解Annotation JAVA注解Annotation 什么是注解 为什么要引入注解 JDK内建Annotation JDK元Annotation Annotation示例 自定义注解 提取Annotation信息 Annotation处理器编写 Annotation处理器处理异常 什么是注解? ??用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override publicString toString()

Java注解(Annotation)详解

转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotation的概念 An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotate

java 注解Annotation

什么是注解? 注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的. java注解又叫java标注,java提供了一套机制,使得我们可以对方法.类.参数.包.域以及变量等添加标准(即附上某些信息).且在以后某个时段通过反射将标注的信息提取出来以供使用. 通过使用Annotation,程序开发人员可以在不改变的原有逻辑的情况下,在源文件嵌入一些补充的信息. Annotation可以用来修饰类.属性.方法,而且Annotation不影响程序

Java注解Annotation(一)

Java注解Annotation(一)--简介 这一章首先简单介绍一下注解,下一章会给出一个注解应用的DEMO. 1. 元注解 元注解的作用是负责注解其他的注解. JDK1.5中,定义了4个标准的meta-annotation元注解类型,他们被用来提供对其它annotation注解类型作说明. @Target @Retention @Documented @Inherited 这些类型和它们所支持的类在java.lang.annotation包中可以找到. @Target @Target说明了A

Java注解Annotation浅析

1. 概述 Java在1.5版本引入注解Annotation,又称Java标注,注解是一种语法元数据,可以被直接使用到源代码中,类/方法/变量/参数/包名等都可以被注解.和Javadoc标签不同,编译器在生成class文件时候能够保留注解代码,同时,可能为了在程序运行过程中(run-time)可以使用注解,Java虚拟机会把注解保留,这样就可以通过反射获取注解Annotation的相关信息. 2. 内置注解 其实我们平时会经常遇见注解,例如@Override.@Deprecated等等,这些都是

Java注解Annotation学习笔记

一.自定义注解 1. 使用关键字 @interface 2. 默认情况下,注解可以修饰 类.方法.接口等. 3. 如下为一个基本的注解例子: //注解中的成员变量非常像定义接口 public @interface MyAnnotation { //不带有默认值 String name(); //带有默认值 int age() default 20; } 4. Reflect中3个常见方法解读 getAnnotion(Class<T> annotationClass) 返回该元素上存在的,指定类

java注解(Annotation)解析

注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ模式代替Schema模式,特别是最近接触了一点Spring MVC,每次编写Controller的时候用@RequestMapping(),@RequestParam,@ResponseBody等等. 我们所用的java中自带的注解都是定义好了的,直接拿来用,它就能发挥作用.当然了,自己也可以定义注

Java注解Annotation详解

注解是一种标记,在程序中加上某种注解就等于为程序打上了某种标记,在javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上是否存在标记,存在什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上. 自定义注解及其应用 1).定义一个最简单的注解 public @interface MyAnnotation {     //...... } 2).把注解加在某个类上: @MyAnnotation public class AnnotationTest{  

深入理解java 注解(Annotation)重版

近期项目需要做权限验证,高手们写了一个权限验证的框架,看了一遍代码,还是和高手有差距啊~ 权限框架用到了一些注解反射啥的,所以回头看看以前写的文章<深入理解java 注解(Annotation)>,转过来,再做一些补充,做备忘使用. 一.什么是注解? 懒得去打了,搞一份wiki上的解释,自己看吧(以前可能会翻译一下,现在懒了) Annotation的使用方式及自定义注解 首先扫下盲,元注解就是Annotation的元注解一共有4个,分别为:@Target.@Retention.@Documen

深入JAVA注解(Annotation):自定义注解 (转)

原文出自:http://blog.csdn.net/yjclsx/article/details/52101922 一.基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email prote