Java 反射getAnnotations()返回null

Java 反射getAnnotations()返回null,java,reflection,Java,Reflection,Searchable.java @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Searchable { } public class Obj { @Searchable String myField; } Obj.java @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public

Searchable.java

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Searchable { }
public class Obj {
    @Searchable
    String myField;
}
Obj.java

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Searchable { }
public class Obj {
    @Searchable
    String myField;
}
void main(字符串[]参数)

我希望
注释
包含我的
@Searchable
。尽管它是
null
。根据文件,这种方法:

返回此元素上存在的所有批注。(如果此元素没有注释,则返回长度为零的数组。)此方法的调用方可以自由修改返回的数组;它对返回给其他调用者的数组没有影响

(对我来说)这更奇怪,因为它返回的是
null
,而不是
Annotation[0]


我在这里做错了什么?更重要的是,我如何才能得到我的
注释

您的代码是正确的。问题出在别的地方。我只是复制并运行了你的代码,它可以正常工作


可能是您在代码中导入了错误的
Obj
类,您可能需要先检查它。

我刚刚为您测试了这个,它可以正常工作:

public class StackOverflowTest {

    @Test
    public void testName() throws Exception {

        Annotation[] annotations = Obj.class.getDeclaredField("myField").getAnnotations();

        System.out.println(annotations[0]);
    }
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Searchable {

}

class Obj {

    @Searchable
    String myField;
}
我运行了它,它产生了以下输出:

@nl.jworks.stackoverflow.Searchable()

您可以尝试在IDE中运行上述类吗?我用IntelliJ、openjdk-6进行了尝试。

在我的例子中,错误出现在我自己的注释中。 我做了几件事,结果是:

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
public @interface MyAnnotation{
}

它现在可以工作了

在我的情况下,我忘了添加

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
对于该方法,因此最终应如下所示:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

它似乎在我的机器上工作。您在运行时使用的Java版本是什么?您能检查一下自定义批注上是否存在
@Retention(RetentionPolicy.RUNTIME)
行吗?您如何知道它返回
null
?你能提供你使用的代码片段吗?完全正确。适用于JDK 1.7.0。@sp00m我从IDE复制,运行时可用。我知道它返回空值,因为我调试了它。我正在使用JDK1.7.0。@Aquillo尝试一个简单的
System.out.println(annotations.length)就在你最后一行之后,检查NPE是否被抛出。这很有效,谢谢。我将进一步研究这个问题,并让你知道。我似乎无法重现我的问题,但问题是通过复制你的示例并将其构建回我的案例来解决的,谢谢Erik!当然,没问题,很高兴我能帮上忙!