java8重复注解

在java8之前,如果需要在同一个元素上使用多个相同类型的注解,需要借助注解“容器”来实现.
例如:

@TestRepeatables({
    @TestRepeatable(name = "test1"),
    @TestRepeatable(name = "test2")}
    )
public class TestAnnotation1 {
}

java8开始引入了新特性:重复注解
在我们定义需要重复的注解时,使用@Repeatable注解表示对应的注解是可重复的。
在这里插入图片描述
在上面的例子中我们可以这样写了:

@TestRepeatable(name = "test1")
@TestRepeatable(name = "test2")
public class TestAnnotation {
    
}

自定义注解代码:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Inherited
@Repeatable(TestRepeatables.class)
public @interface TestRepeatable {
    String name();
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Inherited
public @interface TestRepeatables {

    TestRepeatable[] value();
}

接下来我们写个测试类验证下
代码如下:

public class Test {

    public static void main(String[] args) {
        TestRepeatable testRepeatable = TestAnnotation.class.getAnnotation(TestRepeatable.class);
        System.out.println(testRepeatable.name());
    }

}

运行发现报空指针异常
在这里插入图片描述
我们看下getAnnotation方法源码的介绍:
在这里插入图片描述
明明代码上面使用的就是@TestRepeatable注解,怎么获取不到呢
我们看下编译后的文件如下:
在这里插入图片描述
可以看到编译后的TestAnnotation.class文件上使用的是@TestRepeatables注解,其实可以看到@TestRepeatable注解java8底层帮我们换成了java8之前的那种写法,也就是使用@Repeatable语法糖,底层会帮开发者处理这些事情。

更改测试代码如下:

public class Test {

    public static void main(String[] args) {
        TestRepeatables testRepeatable = TestAnnotation.class.getAnnotation(TestRepeatables.class);

        TestRepeatable[] value = testRepeatable.value();
        Arrays.stream(value).forEach(v->{
            System.out.println(v.name());
        });
    }

}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值