理解注解上的注解@Inherited、@Target、@Retention、@Documented

@Inherited

使用范围:注解类型(Annotation Type)
生命周期:运行时

如果某个注解上有@Inherited注解,当查找该类型的注解时,会先查找目标类型是否存在注解,如果有,直接返回;否则,继续在父类上寻找注解,停止的条件为在父类上找到该类型的注解或者父类为Object类型。

需要注意的是:Java只会搜索父类的注解而不会搜索其实现的接口

@Target

表示某个注解可注解的元素的集合

使用范围:注解类型(Annotation Type)
生命周期:运行时

ElementType

名称描述
TYPE类、接口(包含注解类型)、枚举定义
FIELD类中定义的静态成员、非静态成员以及枚举类型中的常量
METHOD普通方法(不包含构造方法)
PARAMETER方法参数(包含构造方法参数)
CONSTRUCTOR构造方法
LOCAL_VARIABLE局部变量声明
ANNOTATION_TYPE注解类型
PACKAGE用于package-info.java
TYPE_USE用于类型定义、方法参数声明、成员变量定义、存在返回类型的函数声明、局部变量定义

Example

LOCAL_VARIABLE

@Target(ElementType.LOCAL_VARIABLE)
@Retention(RetentionPolicy.RUNTIME)
@interface TestLocalVar {
}

public class TestLocalVarClass {

    private Integer f;

    public TestLocalVarClass(Integer b) throws IOException {
        @TestLocalVar
        Integer a = 0;

        try (@TestLocalVar InputStream in = Files.newInputStream(Paths.get(""))){
        }
        for (@TestLocalVar int i = 0; i < 10; ++i ){

        }
    }
}

TYPE_USE

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@interface TypeUse {
}

@TypeUse
static class TypeUserTestClass {
    private Integer a;
    private String b;
    @TypeUse
    private TypeUserTestClass test;

    @TypeUse
    public Object returnTest(@TypeUse Integer a) {
        @TypeUse
        Integer b = 1;
        return null;
    }
}

@Target({})的理解

@Target({})
@interface TestAnno {
}

@Retention(RetentionPolicy.RUNTIME)
@interface Composite {
    TestAnno[] value();
}

@Composite(@TestAnno)
static class TestClass { }

这种情况下,我们只能将该注解用于作为注解的成员方法类型使用,但不能注解在其他可注解元素之上。

@Retention

表示注解的周期

使用范围:注解类型(Annotation Type)
生命周期:运行时

RetentionPolicy

名称描述
SOURCE该注解将会被编译器丢弃,可以被AnnotationProcessor处理
CLASS注解会在编译成类元信息存放在类文件中,但不会加载到Java运行时,无法通过反射获取
RUNTIME注解会在编译成类元信息存放在类文件中,同时会加载到Java运行时,可以通过反射获取

我们如果需要写运行时注解解析器,一定要记得将注解标记为@Retention(RUNTIME)

@Documented

使用范围:注解类型(Annotation Type)
生命周期:运行时

表示是否需要为注解生成javadoc

当我们不使用@Documented时,我们尝试使用idea查看其document时,会发现文档是空的;但如果加上@Documented,idea就会为其生成相应的文档

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子的木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值