反射构造器注释参数二维数组长度判断

无极大帝 2016-06-26 12:04:21
两个构造器:
public Practice(){

}

public Practice(
//注释参数类型
@Field_Method_Parameter_Annotation(describe = "人员编号", type = int.class)int id,
@Field_Method_Parameter_Annotation(describe = "人员姓名", type = String.class)String name){
this.id = id;
this.name = name;
}

获取构造器参数注释:
Annotation [][] cons_para_anno_arra = cons.getParameterAnnotations();
for(int j = 0; j < cons_para_anno_arra.length; j++){
int leng = cons_para_anno_arra[j].length;
if(leng == 0){
System.out.println("构造器没有参数");
}
else{
for(int k = 0; k < leng; k++){
Field_Method_Parameter_Annotation cons_para_anno = (Field_Method_Parameter_Annotation)cons_para_anno_arra[j][k];
System.out.println(cons_para_anno.describe() + " " + cons_para_anno.type());

}
}
}

System.out.println();
控制台显示:
---------构造器注释---------

人员编号 int
人员姓名 class java.lang.String

第一个构造器没有参数,为啥不显示“”构造器没有参数“?
...全文
99 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
无极大帝 2016-06-27
原来for循环是先判断条件,再进入循环体的,我一直以为是直接进入循环体的。 多谢了。
回复
解开者 2016-06-27
对没有参数的构造器调用getParameterAnnotations方法,返回的二维数组的第一维长度为0(即cons_para_anno_arra.length==0),所以进不去内层循环。第二维长度为0的情况,发生于构造器有参数但参数没有注解,例如你把id的注解删掉试试。 参考jdk文档:
getParameterAnnotations

public Annotation[][] getParameterAnnotations()
按照声明顺序返回一组数组,这些数组表示通过此 Constructor 对象表示的方法的形参上的注释。(如果底层方法没有参数,则返回一个长度为零的数组。如果该方法有一个或多个参数,则为每个不带注释的参数返回一个长度为零的嵌套数组。)包含在返回数组中的注释对象是可序列化的。此方法的调用者可以自由地修改返回的数组;它对返回给其他调用者的数组没有影响。
返回:
按照声明顺序返回的一组数组,这些数组表示此 Constructor 对象表示的方法的形参上的注释
从以下版本开始:
1.5
回复
无极大帝 2016-06-26
完整代码如下: package Number; import java.lang.reflect.*; import java.io.*; import java.lang.annotation.*; @Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER}) //用于方法 @Retention(RetentionPolicy.RUNTIME) @interface Field_Method_Parameter_Annotation{ String describe(); Class type() default void.class; } public class Practice{ @Field_Method_Parameter_Annotation(describe = "人员编号", type = int.class) //注释编号 int id; @Field_Method_Parameter_Annotation(describe = "人员姓名", type = String.class) String name; //注释姓名 public Practice(){ } public Practice( //注释参数类型 @Field_Method_Parameter_Annotation(describe = "人员编号", type = int.class)int id, @Field_Method_Parameter_Annotation(describe = "人员姓名", type = String.class)String name){ this.id = id; this.name = name; } public static void main(String[] args){ //建立反射 Practice prac = new Practice(); Class prac_clas = prac.getClass(); //获取构造器的注释 Constructor [] cons_arra = prac_clas.getDeclaredConstructors(); System.out.println("---------构造器注释---------"); for(int i = 0; i < cons_arra.length; i++){ Constructor cons = cons_arra[i]; Annotation [][] cons_para_anno_arra = cons.getParameterAnnotations(); for(int j = 0; j < cons_para_anno_arra.length; j++){ int leng = cons_para_anno_arra[j].length; if(leng == 0){ System.out.println("构造器没有参数"); } else{ for(int k = 0; k < leng; k++){ Field_Method_Parameter_Annotation cons_para_anno = (Field_Method_Parameter_Annotation)cons_para_anno_arra[j][k]; System.out.println(cons_para_anno.describe() + " " + cons_para_anno.type()); } } } System.out.println(); } } }
回复
发帖
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2016-06-26 12:04
社区公告
暂无公告