我是一个共享多个项目的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;
到目前为止,我已尝试过:
无法扩展/实现注释
将常量字符串定义为默认值,但除非将字符串标记为" final"否则它不会编译。
String dateFormat()默认为BooClass.MyConstant;
在这种情况下,我有哪些选择?
答案 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