Java覆盖注释的默认值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java覆盖注释的默认值相关的知识,希望对你有一定的参考价值。

我有一个共享多个项目的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. 无法扩展/实现Annotation
  2. 将常量字符串定义为默认值,但除非将字符串标记为“final”,否则不会编译。 String dateFormat()默认为BooClass.MyConstant;

在这种情况下我有什么选择?

答案

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

在运行时,您需要提供“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

以上是关于Java覆盖注释的默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用java注释设置类属性的默认值[重复]

php代码审计整理

c# 抽象方法添加覆盖的默认注释

java方法名前注释问题

Gson @SerializedName注解使用说明

Python snippet(代码片段)