2015-05-14 128 views
3

有麻煩的方法的參數標註,下面是一個簡單的測試演示,對錯誤的指示將受到歡迎:爪哇 - 參數標註

// Annotation 
public @interface At {} 

// Class 
public class AnnoTest { 

    public void myTest(@At String myVar1, String myVar2){} 
} 

// Test 
public class App { 

    public static void main(String[] args) { 

     Class myClass = AnnoTest.class; 

     Method method = myClass.getMethods()[0]; 
     Annotation[][] parameterAnnotations = method.getParameterAnnotations(); 

     // Should output 1 instead of 0 
     System.out.println(parameterAnnotations[0].length); 
    } 
} 
+1

你面對什麼樣的錯誤? – Vihar

回答

3

您沒有設置隱含設置Retention到運行時,這種方式默認爲@Retention (RetentionPolicy.CLASS),這表示它在類文件中表示,但在虛擬機中不存在。爲了使它工作,添加到您的界面:@Retention (RetentionPolicy.RUNTIME)作爲類annotatio,然後它再次工作! :d

當你在這,你可能需要設置一個特定的@Target只參數,而不是方法/場/班等

1

默認情況下,註釋是由編譯器記錄在類文件,但不需要在運行時由VM保留(正在應用RetentionPolicy.CLASS保留策略)。

要更改註釋的保留時間,您可以使用保留元註釋。

在你的情況,你想使它可用於讀取反思所以你需要它必須使用RetentionPolicy.RUNTIME記錄註釋中的類文件,但還是老樣子可以通過虛擬機在運行時保留。

@Retention(RetentionPolicy.RUNTIME) 
public @interface At {} 

我也建議你指明程序元件,其註釋類型是適用的。

在你的情況,參數annotion應該

@Target(ElementType.PARAMETER) 

這樣編譯器會執行指定的使用限制。

默認情況下,聲明的類型可以由任何程序元件上使用:

  • ANNOTATION_TYPE - 譯註類型聲明
  • CONSTRUCTOR - 構造函數聲明
  • 領域 - 字段聲明(包括枚舉常數)
  • LOCAL_VARIABLE - 局部變量聲明
  • 方法 - 方法聲明
  • 包裝 - 包裝聲明
  • 參數 - 參數聲明
  • TYPE - 類,接口(包括註釋類型)或枚舉聲明