2012-03-09 200 views
6

我正在嘗試使用反射和註釋。 由於某種原因,無論何時將註釋添加到字段(或類或方法),並使用反射來查看該字段,我都會看到它的annotations字段爲空。reflect.Field.annotations始終爲空

例如,下面的代碼:

public class Test { 
    public static void main(String[] args) throws NoSuchFieldException, SecurityException { 
     System.out.println(Test.class.getField("bl").getAnnotations().length); 
    }  
    @anno 
    public int bl;  

    public @interface anno {}  
} 

打印0

BTW,Java不忽視一般的註解,當(例如)我用的是@Deprecated註解 - Eclipse中識別並告訴我這個課程已被棄用。

我正在使用Eclipse Indigo和Java SE開發工具包7更新2. 謝謝!

回答

22

默認情況下,註釋不可用於反射。爲了做到這一點,你需要改變的保留策略,即

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

可以在Javadoc中發現的各種保留策略。默認(因爲神祕原因,沒有人知道)是CLASS

+0

skaffman - 你是男人! – Ginandi 2012-03-09 15:55:04

+1

@Ginandi:很高興能這樣說:)有人仍然認爲這值得讚賞,請介意你... – skaffman 2012-03-09 15:58:01

+1

@skaffman請你可以替換保留的保留 – 2012-06-20 04:36:51

4

我會檢查@Retention例如

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Deprecated { 
} 

如果您沒有設置它,它將在運行時不可見。