前言
自从 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_PARAMETER
、TYPE_USE
。
TYPE_PARAMETER
:表示该注解能够写在 声明为泛型
的语句中,类型参数声明如:<T>、<T extends 某个类>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♪(・ω・)ノ