我有一个像这样的注释
public @interface anno{
String a1() default "defaultValueA1";
String a2() default "defaultValueA2";
String a3() default "defaultValueA3"
}
Class SuperClass{
@anno(a1="myA1", a3="myA3")
private String field1;
}
Class SubClass extends SuperClass(){
@anno(a2="myA2", a3="defaultValueA3")
private String field1;
}
目前当我尝试从子类获取注释时,anno只包含自定义的a2,但是a1只能获取默认值,有没有办法得到一个注释混合所有超类指定的字段,如{a1:myA1, a2:myA2, a3:defaultValueA3}
但不{a1:defaultValueA1,a2:myA2, a3:defaultValueA3}
?
更新
我知道注释不是可继承的,所以我尝试混合使用subClass注释{a1:defaultValueA1, a2:myA2, a3:defaultValueA3}
和superClass annotaion {a1:myA1, a2: defalutValueA2, a3:myA3}
,我的方法是获取所有subClass自定义值并将它们复制到superClass注释,但问题是什么时候我从subClass获取所有注释值,我不能解析哪个值是用户定义的,哪个值来自默认值,任何人都有建议?
private void mixAnnotaiont(Annotation target, Annotation source){
Method[] methods = source.annotationType().getMethods();
Map<String, Object> sourceCfg = AnnotationUtils.getAnnotationAttributes(source);
for (int i = 0; i < methods.length; i++) {
// skip default value, but it's incorrect, user may specify default value in subClass to overwrite superClass value
Object defaultValue = methods[i].getDefaultValue();
String name = methods[i].getName();
if(sourceCfg.get(name).equals(defaultValue)){
ignoreProperties.add(name);
}
}
BeanUtils.copyProperties(source, target, ignoreProperties.toArray(new String[] {}));
}
感谢您的关注。
答案 0 :(得分:0)
根据JavaDoc继承注释:
Open Declaration Annotation [] java.lang.Class.getDeclaredAnnotations()
返回直接出现在此元素上的所有注释。 与此接口中的其他方法不同,此方法忽略 继承了注释。 (如果没有,则返回长度为零的数组 注释直接出现在这个元素上。)这个的调用者 方法可以自由修改返回的数组;它不会有任何影响 数组返回给其他调用者。
但是您可以尝试使用while循环并使用此方法获取所有声明的注释 java.lang.Class.getSuperclass()
while(loop thru the super class)
{
// get declared annotation
}