Method.getParameterAnnotations()用法
最近学习反射和注解,顺便记录下来
定义@MyRequestParameter注解
@Target(value = {ElementType.PARAMETER}) //表示该注解只能应用在参数上
@Retention(value = RetentionPolicy.RUNTIME) //表示该注解在运行时期仍可以起作用
public @interface MyRequestParameter {
String value() default "";
}
定义@MyRequestParameter1注解
@Target(value = {ElementType.PARAMETER}) //表示该注解只能应用在参数上
@Retention(value = RetentionPolicy.RUNTIME) //表示该注解在运行时期仍可以起作用
public @interface MyRequestParameter1 {
String value() default "";
}
添加测试方法
public void testParameterAnnotations(@MyRequestParameter("name") @MyRequestParameter1("name1") String name,
@MyRequestParameter("telephone") String telephone,Integer age){
}
测试
public static void main(String[] args) throws NoSuchMethodException {
Class<Test> clazz = Test.class;
Method method=clazz.getMethod("testParameterAnnotations", String.class, String.class,Integer.class);
Annotation[][] annotations = method.getParameterAnnotations();
for(int i=0;i<annotations.length;i++){
System.out.println("第"+(i+1)+"个参数有"+annotations[i].length+"个注解");
for(int j=0;j<annotations[i].length;j++){
if(annotations[i][j] instanceof MyRequestParameter){
MyRequestParameter myRequestParameter=(MyRequestParameter) annotations[i][j];
System.out.println("annotations["+i+"]["+j+"] = " + myRequestParameter.value());
}else if(annotations[i][j] instanceof MyRequestParameter1){
MyRequestParameter1 myRequestParameter1=(MyRequestParameter1) annotations[i][j];
System.out.println("annotations["+i+"]["+j+"] = " + myRequestParameter1.value());
}
}
}
}
输出
第1个参数有2个注解
annotations[0][0] = name
annotations[0][1] = name1
第2个参数有1个注解
annotations[1][0] = telephone
第3个参数有0个注解
总结
在这里解释一下,
Annotation[][] annotations = method.getParameterAnnotations();
为什么返回的是一个二维数组呢,这是因为每一个参数前面可能会有多个不同注解修饰。其中annotations[0]代表第一个参数,annotations[1]代表第二个参数。
像第一个参数的话,它有2个注解,annotations[0][0]表示第一个注解,annotations[0][1]表示第二个注解,
第二个参数的话,它只有1个注解,因此用annotations[1][0]表示这个注解
由于第三个参数上没有注解,所以就没有数据。
有什么理解错误的话,欢迎大家各位指正!