Java覆盖注释的默认值

时间:2016-02-02 03:52:30

标签: java annotations

我是一个共享多个项目的jar库,该库的目的是将带注释的字段转换为stringify API响应。

public @interface MyField {
   ...
   String dateFormat() default "dd/MM/yyyy";
   ...
}

使用它:

@MyField
private String myDate;

问题是当项目使用不同的日期格式(例如yyyy / MMM / dd)时,我必须在整个项目中明确标记每个注释字段,如下例所示:

@MyField(dateFormat = "yyyy/MMM/dd")
private String myDiffDate;

到目前为止,我已尝试过:

  1. 无法扩展/实现注释

  2. 将常量字符串定义为默认值,但除非将字符串标记为" final"否则它不会编译。

    String dateFormat()默认为BooClass.MyConstant;

  3. 在这种情况下,我有哪些选择?

1 个答案:

答案 0 :(得分:0)

我尝试使用数组操作注释的默认值,假设它与通过引用存储值一样工作。但它不起作用,似乎在数组的情况下,它返回一个克隆版本。请尝试以下代码...

在跑步时你需要提供“test”作为参数 -

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    public class ManipulateAnnotationDefaultValue {

    public static void main(String[] args) throws NoSuchFieldException, SecurityException {

        String client = args.length > 0 ? args[0] : "default";
        MyField annotation = DefaultMyField.class.getDeclaredField("format").getAnnotation(MyField.class);

        String[] defaultValue = annotation.dateFormat();
        System.out.println("Hash code of MyField.dateFormat = " + defaultValue.hashCode());
        System.out.println("Value of MyField.dateFormat = " + defaultValue[0]);

        if (!client.equals("default")) {
            System.out.println("Changing value of MyField.dateFormat[0] to = 'dd-MM-yyyy'");
            defaultValue[0] = "dd-MM-yyyy"; // change the default value of annotation //$NON-NLS-1$
        }

        defaultValue = annotation.dateFormat();
        System.out.println("Hash code of MyField.dateFormat = " + defaultValue.hashCode());
        System.out.println("Value of MyField.dateFormat = " + defaultValue[0]);
    }
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyField {

    String[] dateFormat() default {"dd/MM/yyyy"};
}

class DefaultMyField {

    @MyField
    String format;

}

以下是输出 -

Hash code of MyField.dateFormat = 356573597
Value of MyField.dateFormat = dd/MM/yyyy
Changing value of MyField.dateFormat[0] to = 'dd-MM-yyyy'
Hash code of MyField.dateFormat = 1735600054
Value of MyField.dateFormat = dd/MM/yyyy