Java8新特性(四)重复注解

一、为什么要用重复注解

在Java 8之前我们在方法或类上同种注解只能声明一次,在一些业务条件下光靠注解就无法实现需求。
例如我们定义的@RequestMapping注解和@Student的注解:

public class TestJava8 {

	@RequestMapping("/test")
	@RequestMapping(value = "/test2",method = Method.POST)
	public void test(){
		
	}
}

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface RequestMapping{
	
	String value();
	
	Method method() default Method.GET;
}

enum Method{POST,GET}

或者简单一点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xc9ZPWL0-1653903175625)(//img-blog.csdn.net/20180318015243211?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NDkzODg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
两种都会报错,或许你可以通过改变数组设计方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gI2BpUMF-1653903175626)(//img-blog.csdn.net/20180318015736589?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NDkzODg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
虽然编译期不报错了,你有没发现这种编程方式十分的不优雅,不管是使用者在用该注解时,还是设计者在通过反射获取值时都十分的不方便。

二、重复注解的引入
2.1、再定义一个@StudentList注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface StudentList{
	Student[] value();
}
2.2、在@Student注解上添加@Repeatable注解

Java 8中提供了一个注解@Repeatable

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(StudentList.class)
@interface Student{
	
	String name();
	
	int age();
}
2.3 两种写法
//写法一
@Student(age = 17, name = "张三")
@Student(age = 18, name = "李四")
public void test(){

}
//写法二
@StudentList({@Student(age = 17, name = "张三"),@Student(age = 18, name = "李四")})
public void test1() {

}

这时编译期正常
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-097qqcbm-1653903175627)(//img-blog.csdn.net/20180318021810114?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NDkzODg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]

2.4、获取值

两个方法在反射获取值时,你需要把@Student当成@StudentList

//获取值
Class<?> clazz = TestJava8.class;
Method method = clazz.getMethod("test");
StudentList studentList = method.getAnnotation(StudentList.class);
Student[] values = studentList.value();
for (Student stu : values) {
	System.out.println(stu.name());
	System.out.println(stu.age());
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

terrybg

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

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

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

打赏作者

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

抵扣说明:

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

余额充值