Java注解详解

本文详细介绍了Java注解的各个方面,包括注解的定义、元素、默认值、用途,以及元注解如@Documented、@Target、@Retention、@Inherited等的用法。此外,还讲解了注解的检索方法和如何处理重复注解。
摘要由CSDN通过智能技术生成

参考资料

  1. Java中的注解是如何工作的?
  2. Java基础加强总结(一)——注解(Annotation)
  3. Java注解教程
  4. Java Annotation认知(包括框架图、详细介绍、示例说明)
  5. Java Language Specification - Chapter 9. Interfaces
  6. Java魔法堂:注解用法详解——@SuppressWarnings

源码地址

java_annotations

概述

对于注解而言,可以用一个词描述,那就是元数据,即一种描述数据的数据。Annotations仅仅是元数据,和业务逻辑无关。Annotations仅仅提供它定义的属性(类/方法/包/域)的信息。
Annotations的使用者(javac编译器、开发工具和其他程序)来读取这些信息并实现必要的逻辑。

Annotation

public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

Annotation是所有注解类型的公共接口,而且所有的注解必须实现这个接口。需要注意的是,由于注解类型声明是一种特殊的接口声明。为了区分注解类型声明与普通接口的声明,在关键字前面添加了@用以区别,即@infterface。 例如:

public @interface A {
	
}

上面代码中,声明了注解A,通过@infterface表明其实现了Annotation接口及其是一个注解类。

元素

注解的本身是一种数据类型,是Annotation的实现类,当然也可以在其内声明被称为元素的成员。与普通数据类型不同的是,注解类型通过方法声明定义注解类型的元素。例如:

public @interface B {
	String name();
	
	int version();
}

在注解B中,声明了两个元素nameversion,它们都是通过方法声明的。

值的注意的是:

  1. 注解类型可以包含零个或多个元素。
  2. 注解类型的元素的数据类型为:基本类型、字符串(String)、类、类的任何参数化调用、枚举类型、注解类型或数组类型。
  3. 在注解类型中声明的任何方法不能覆盖在类Object或接口java.lang.annotation.Annotation中声明的任何公共或受保护的方法,否则出现编译时错误。
  4. 注解类型不能直接或间接泛型元素,否则出现编译时错误。

默认值

注解类型元素可以为其指定的默认值。在指定默认值时使用使用关键字default和元素的默认值(空值或值列表)。其中

  1. 未指定默认值的元素,必须在使用时对该元素赋值。
  2. 给定的元素默认值的数据类型必须与元素的数据类型一致。

例如:

public @interface C {
	String name() default "tea";
	
	int version();
}


@C(version = 1)
public class CC {
	
	@C(name = "2", version = 2)
	String a;
}

在注解类型C,中声明了两个元素nameversion,其中,name指定了默认值tea。当使用C时,可以不对元素name赋值。当未对元素version赋值时,IDE会报错,提示"version是必要的但是没有找到",也就意味着未指定默认值的元素,必须在使用时对该元素赋值

image

用途

注解有多种用途,包括:

  • 向编译器提供信息 —— 编译器使用注解检查错误或忽略警告
  • 编译时和部署时处理 —— 注解处理工具可以处理注解信息来生成代码,XML文件等等
  • 运行时处理 —— 一些注解在运行时进行审查

元注解

在注解类上使用另一个注解类,那么被使用的注解类就称为元注解.

Java SE API预定义了一组注解类型。某些注解用于Java编译器,一些适用于其他注解。

  • @Documented
  • @Target
  • @Retention
  • @Inherited
  • @Override
  • @SuppressWarnings
  • @Deprecated
  • @SafeVarargs
  • @FunctionalInterface
  • @Repeatable

@Documented

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

@Documented用于注解类型的声明,表示是否将注解信息添加在java文档中。如果将@Documented用于注解类型声明,那么该注解将成为javadoc的API中.声明Annotation时,@Documented可有可无;若没有定义,则Annotation不会出现在javadoc中。

@Target

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

public enum ElementType {
    // 用于描述类、接口或enum声明
    TYPE,

    // 用于描述实例变量
    FIELD,

    // 用于描述方法
    METHOD,

    // 用于描述参数
    PARAMETER,

    // 用于描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值