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;
到目前为止,我尝试过:
- 无法扩展/实现Annotation
- 将常量字符串定义为默认值,但除非将字符串标记为“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覆盖注释的默认值的主要内容,如果未能解决你的问题,请参考以下文章