reflect.Field.annotations 始终为 null

6

我正在尝试使用反射和注解。但是每当我向字段(或类或方法)添加注解,并使用反射查看该字段时,我发现其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。

顺便说一下,Java通常不会忽略注释,例如当我使用@Deprecated注释时 - Eclipse会识别它并告诉我该类已过时。

我正在使用Eclipse Indigo和Java SE Development Kit 7更新2版。谢谢!

2个回答

24

默认情况下,注解不会在反射中可用。要使其可用,需要更改保留策略,即:

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

各种保留策略可以在Javadoc中找到。默认的(出于神秘原因,似乎没有人知道)是CLASS


1
@Ginandi:你这么说真是太好了 :) 不过还有人认为它值得被踩,你知道... - skaffman

5
我建议检查一下 @Retention,例如:
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接