2012-03-09 5 views
6

私は反射と注釈で再生しようとしています。私は、フィールド(またはクラスやメソッド)に注釈を追加するたびに、いくつかの理由 、およびフィールドを確認するためにリフレクションを使用して、私はそのannotationsフィールドがnullであることがわかります。reflect.Field.annotations null常に

例えば、このコード:

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

ところで、Javaは一般に注釈を無視しない、および(例えば)私は@Deprecatedアノテーションを使用する場合 - Eclipseはそれを認識しクラスが推奨されなくなりました。

は、私は、EclipseインディゴとJava SE Development Kitの7の更新2. 感謝を使用しています!

答えて

22

はデフォルトでは、注釈は反射に使用できません。そうするためには、さまざまな保持ポリシーがJavadocで見つけることができます保存ポリシーを変更する必要がある、すなわち

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

。デフォルト(誰も知らないと思われる神秘的な理由のため)はCLASSです。

+0

skaffman - あなたは男です! – Ginandi

+1

@Ginandi:あなたのニースがそう:)誰かがまだdownvote、あなたの心... – skaffman

+1

@skaffmanそれは価値があると思ったあなたはリテンションにRententionを置き換えることができます言うこと –

4

私は@Retention例えばチェックします

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

設定しないと、実行時に表示されません。