JDK8新特性(六):JDK 8 可重复注解 与 类型注解

前言

       自从 Java 5 中引入注解依赖,注解开始变得非常流行,并在各个框架和项目中被广泛使用。
       不过注解有一个很大的限制:在同一个地方不能多次使用同一个注解。为了解决这个问题,JDK 8 引入了可重复注解的概念,允许在同一个地方多次使用同一个注解。 在 JDK 8 之前,注解只能用在各种程序元素(定义类、定义接口、定义方法、定义成员变量…)上。为了解决这个问题, JDK8 引入了类型注解,类型注解可以使注解用在任何地方。

1.可重复注解

       在 Java 8 之前我们不能在同一个类同一方法上重复使用同一个注解

@PropertySource("classpath:config1.properties")
@PropertySource("classpath:config2.properties")
public class AnnotationDemo{
	//代码部分
}

       上面的代码无法在 Java 7 下通过编译,错误是: Duplicate annotation。在 JDK 8 中引入了一个注解 @Repeatable 来标识某个注解是可被重复使用的,但是需要一个容器注解。可重复注解的使用步骤如下:

1.1定义可重复的注解容器注解

@Retention(RetentionPolicy.RUNTIME)
@interface MyTests {//这是重复的容器注解
    MyTest[] value();
}

1.2定义一个可以重复的注解

@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyTests.class)
@interface MyTest{
    String value();
}

1.3配置多个重复的注解

@MyTest("mt1")
@MyTest("mt2")
@MyTest("mt3")
public class annotationDemo {

    @Test
    @MyTest("ms1")
    @MyTest("ms2")
    public void test(){

    }

    @Test
    @MyTest("mn1")
    @MyTest("mn2")
    public void test(String name){

    }
}

1.4解析配置的重复注解

@MyTest("mt1")
@MyTest("mt2")
@MyTest("mt3")
public class annotationDemo {

    @Test
    @MyTest("ms1")
    @MyTest("ms2")
    public void test(){

    }

    @Test
    @MyTest("mn1")
    @MyTest("mn2")
    public void test(String name){

    }

	//4.解析配置的重复注解
    public static void main(String[] args) throws NoSuchMethodException {
        //4.1 获取类上的注解
        //getAnnotationsByType() 是新增的API,用于用户获取重复的注解
        MyTest[] annotationsByType = annotationDemo.class.getAnnotationsByType(MyTest.class);
        for (MyTest myTest: annotationsByType) {
            System.out.println("获取类上的注解:"+myTest.value());
        }

        //4.2 获取(无参方法)方法上的注解
        //getAnnotationsByType() 是新增的API,用于用户获取重复的注解
        MyTest[] tests = annotationDemo.class.getMethod("test", null).getAnnotationsByType(MyTest.class);
        for (MyTest myTest: tests) {
            System.out.println("获取(无参方法)方法上的注解:"+myTest.value());
        }

        //4.2 获取(有参方法)方法上的注解
        //getAnnotationsByType() 是新增的API,用于用户获取重复的注解
        MyTest[] tests1 = annotationDemo.class.getMethod("test", String.class).getAnnotationsByType(MyTest.class);
        for (MyTest myTest: tests1) {
            System.out.println("获取(有参方法)方法上的注解:"+myTest.value());
        }
    }
}

解析结果:

获取类上的注解:mt1
获取类上的注解:mt2
获取类上的注解:mt3
获取(无参方法)方法上的注解:ms1
获取(无参方法)方法上的注解:ms2
获取(有参方法)方法上的注解:mn1
获取(有参方法)方法上的注解:mn2

2.类型注解

     JDK 8 为 @Target 元注解新增了两种类型:TYPE_PARAMETERTYPE_USE

  1. TYPE_PARAMETER:表示该注解能够写在 声明为 泛型 的语句中,类型参数声明如:<T>、<T extends 某个类>
  2. TYPE_USE:表示注解可以用在[任何用到类型]的地方使用

2.1 TYPE_PARAMETER 的使用

//1.TYPE_PARAMETER:表示注解能够放在泛型上面
@Target(ElementType.TYPE_PARAMETER)
@interface TypeParam{
    
}
//Demo
public class typeParameterDemo<@TypeParam T> {
    @Test
    public <@TypeParam T> T test(){
        return null;
    }
}

2.2 TYPE_USER 的使用

//表示注解可以用在[任何用到类型]的地方使用
@Target(ElementType.TYPE_USE)
@interface NotNull{

}
//Demo
public class typeUseDemo {

    private @NotNull int num = 10;

    @Test
    public void test(@NotNull String name,@NotNull int age){
        @NotNull long l = 1000l;
    }
}

附:JDK8新特性(目录)

    本目录为 JDK8新特性 学习目录,包含JDK8 新增全部特性的介绍。

    如需了解,请跳转链接查看:我是跳转链接


博主写作不易,来个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

扛麻袋的少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值