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

有没有办法在Java中混合或继承注释值?,java,annotations,java-7,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

我有一个这样的注释

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}


更新:

我知道注释是不可继承的,所以我尝试混合子类注释
{a1:defaultValueA1,a2:myA2,a3:defaultValueA3}
和超类注释
{a1:myA1,a2:defalutValueA2,a3:myA3}
,我的方法是获取所有子类自定义值并将它们复制到超类注释,但问题是,当我从子类获取所有注释值时,我无法区分哪个值是用户定义的,哪个值来自默认值,有人有建议吗

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[] {}));
}
private void mixannotationt(注释目标、注释源){
方法[]方法=source.annotationType().getMethods();
Map sourceCfg=AnnotationUtils.getAnnotationAttributes(源);
for(int i=0;i

感谢您的关注。

根据JavaDoc,注释不是继承的:

打开声明注释[]java.lang.Class.getDeclaredAnnotations()

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

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


谢谢是的,我可以从检索所有超类中获取所有注释,但我一直在研究如何混合它们。。。我在尝试混合所有注释时添加了我的问题。好的,正如您所知,注释在编译时得到解决,其属性值在运行时保持不变。然后知道属性的默认值是什么。从子类获取属性时,可以检查该值,以确定其是用户定义的还是默认的。或者,您可以存储来自超类的属性值,并与从子类提取的每个值进行比较,以了解其是否为用户定义的。谢谢。但我仍然有问题,如果我从子类得到一个值,如果这个值与超类和defaultValue不同,那么我可以简单地重写supervalue,但是如果子类的值与超类不同,但与defaultValue相同,那么我不知道我应该重写,在这种情况下,子类的值可以来自defaultValue,也可以仅由用户设置(与defaultValue相同)。很抱歉,这可能有点复杂,我在问题中的示例可能会在这里说明得更清楚。好的,另一个想法,为什么不从注释中删除默认值并将其设置为空“”(可以将其视为“无值”)。这将帮助您跟踪谁设置了值(Sub或Super),并且在计算结束时,如果Sub或Super未设置任何值,则使用默认值(如果需要)。但是如果没有默认值,则用户必须在每个类字段中手动设置每个注释字段,这是一种糟糕的体验。。。。
while(loop thru the super class)
{
   // get declared annotation
}