Java的注解

作者: isLJli | 来源:发表于2021-04-05 17:57 被阅读0次

1. 定义

java注解是JDK1.5引进的一种技术,注解本身是一种元数据,元数据就是描述数据的数据,它对程序本身没有任何的影响。配合反射可以在运行时处理注解,配合apt tool可以在编译使处理注解,apt tool在JDK1.6已经被整合到javac中。

2. 作用

注解对程序的起到标识和传值的作用,对本身的程序运用并没有影响。可以配合反射(运行时的注解)和自定义注解处理器(编译时的注解)处理注解。java本身也内置一些注解,比如@Override表示重写父类的方法,@Deprecated表示改方法或属性已经过时。

3. 入门

3.1 定义

在Java中通过@interface来表示这是一个注解:

public @interface AnnotationTest {
}

3.2 元注解

仅仅像上面定义一个注解是没用的,还需要有元注解的修饰,所谓的元注解,就是注解的注解。java的元注解包括:@Retention、@Target、@Documented、@Inherited、@Repeatable。

@Retention 保留的意思,即注解的生命周期保留到什么时候,它有三个保留阶段,范围逐渐增大

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
  /**
   * Returns the retention policy.
   * @return the retention policy
   */
  RetentionPolicy value();
}
类型 范围
RetentionPolicy.RUNTIME 注解可以保留在运行时、编译、源码期间,可以通过反射、注解处理器获得
RetentionPolicy.CLASS 注解可以保留在编译阶段,但在虚拟机运行阶段时会被丢弃,可以通过注解处理器获得
RetentionPolicy.SOURCE 注解只保留在源码阶段,在编译器编译时就会被丢弃。
@Retention(RetentionPolicy.RUNTIME)  // 运行、编译、源码阶段
@Retention(RetentionPolicy.CLASS)  // 编译阶段
@Retention(RetentionPolicy.SOURCE) // 源码阶段
public @interface AnnotationTest {
}

@Target 翻译是目标的意思,表示注解能标识于什么类型中

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
  /**
   * Returns an array of the kinds of elements an annotation type
   * can be applied to.
   * @return an array of the kinds of elements an annotation type
   * can be applied to
   */
  ElementType[] value();
}
类型 范围
ElementType.TYPE 注解目标在类,接口(包括注解接口)、枚举类
ElementType.FIELD 注解目标在属性变量(包括枚举)
ElementType.METHOD 注解目标在方法
ElementType.PARAMETER 注解目标在方法的形式参数
ElementType.CONSTRUCTOR 注解目标在构造方法
ElementType.LOCAL_VARIABLE 注解目标在局部变量声明。
ElementType.ANNOTATION_TYPE 注解目标在注解类中
ElementType.PACKAGE 注解目标在包中
ElementType.TYPE_PARAMETER 1.8后才支持,泛型类型
ElementType.TYPE_USE 1.8后才支持,除了PACKAGE外的所有类型。
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.CONSTRUCTOR, ElementType.TYPE, ElementType.METHOD})
public @interface AnnotationTest {
}

@Documented将注解的元素包含在javadoc中

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

@Inherited有该元注解修饰的注解,注解标识的父类,子类同样有该注解

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE})
@Inherited()
public @interface AnnotationTest {
}

@AnnotationTest
public abstract class A {
}

public class B extends A {
}

这里的子类B,由于AnnotationTest注解被@Inherited修饰有继承关系,所以B也继承了AnnotationTest注解。

@Repeatable是JDK1.8才加入的一个元注解,这个的作用就是允许同一个注解在一个类型上标注多次。

@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Filters.class)
public @interface Filter {
  String value();
}

@Retention(RetentionPolicy.RUNTIME)
@interface Filters {
  Filter[] value();
}

3.3 属性

注解只能起到标识的作用,如果想要传递参数,可以通过给注解设置属性来传递参数。
注解的属性设置跟类的属性设置不一样,但跟类的方法设置相似。

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE})
public @interface AnnotationTest {
  int age();

  String name();
}

注解的属性的赋值,通过名字来设置:

@AnnotationTest(age = 12, name = "zhangsan")
public abstract class A {
}

也可以给注解的属性设置默认值,那赋值时可以不用写:

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE})
public @interface AnnotationTest {
  int age() default 20;

  String name();
}

@AnnotationTest(name = "zhangsan")
public abstract class A {
}

如果你的属性只有一个,而且属性的名字是value,那么在赋值时可以不写名字:

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE})
public @interface AnnotationTest {
  int value();
}

@AnnotationTest(23)
public abstract class A {
}

相关文章

  • 菜鸟学服务端技术----Spirng基础

    注解 Java基础加强总结(一)——注解(Annotation) java中的注解是如何工作的? java 注解 ...

  • 自定义注解

    java annotation基础 java注解分为标准注解和元注解。 标准注解是java为我们提供的预定义的注解...

  • Java原生注解和Spring注解的说明

    注解 java 原生注解 Spring 中的注解 一 Java原生注解 Java注解是在JDK1.5以后引入的新特...

  • Java注解的使用

    Java注解的使用 参考 廖雪峰java教程 使用注解 什么是注解(Annotation)?注解是放在Java源码...

  • Java 注解

    JAVA注解 Java 自带注解(系统注解) @Override 表示重写注解 @Deprecated 表示过时的...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

  • Java注解学习总结(脑图)

    注解的提取测试:定义注解: 测试注解提取: 参考:《Java编程思想》java注解

  • Java注解(三)—元注解

    元注解就是注解的注解,是Java内置的注解。Java提供四个元注解:@Retention @Target @Doc...

  • Java注解简介篇

    摘要 本文详细介绍java注解是什么,如何声明java注解,如何解析java注解。最后介绍JDK提供的几大基本注解...

  • java 中的注解

    java 中的注解 使用的时候可以参考秒懂,Java 注解 (Annotation)你可以这样学 Java 注解用...

网友评论

    本文标题:Java的注解

    本文链接:https://www.haomeiwen.com/subject/rzvthltx.html