2012-03-09 162 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 { 
} 

如果您没有设置它,它将在运行时不可见。