有没有办法在Java中混合或继承注释值?

时间:2014-08-05 07:30:01

标签: java annotations java-7

我有一个像这样的注释

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[] {}));
}

感谢您的关注。

1 个答案:

答案 0 :(得分:0)

根据JavaDoc继承注释:

  

Open Declaration Annotation [] java.lang.Class.getDeclaredAnnotations()

     

返回直接出现在此元素上的所有注释。   与此接口中的其他方法不同,此方法忽略   继承了注释。 (如果没有,则返回长度为零的数组   注释直接出现在这个元素上。)这个的调用者   方法可以自由修改返回的数组;它不会有任何影响   数组返回给其他调用者。

但是您可以尝试使用while循环并使用此方法获取所有声明的注释 java.lang.Class.getSuperclass()

while(loop thru the super class)
{
   // get declared annotation
}