2016-02-02 95 views
1

我有一個跨多個項目共享的jar庫,庫的目的是將帶註釋的字段轉換爲stringify API響應。Java重寫註釋的默認值

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. 定義的常量字符串作爲默認值,但它不會編譯除非字符串被標記爲「最終」。

    String dateFormat()默認BooClass.MyConstant;


什麼選擇我要在這種情況下?

回答

0

我試圖操縱註釋的默認使用數組,假定它的工作原理與通過引用存儲數值相同。但它不起作用,似乎在數組的情況下它返回一個克隆版本。試試下面的代碼...

在運行,你需要提供 「測試」 作爲參數 -

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