我是靠谱客的博主 淡然路灯,最近开发中收集的这篇文章主要介绍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♪(・ω・)ノ

最后

以上就是淡然路灯为你收集整理的JDK8新特性(六):JDK 8 可重复注解 与 类型注解的全部内容,希望文章能够帮你解决JDK8新特性(六):JDK 8 可重复注解 与 类型注解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部