13

可搜索的.java

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

对象.java

public class Obj {
    @Searchable
    String myField;
}

无效的主要(字符串 [] 参数)

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

我希望annotations包含我的@Searchable. 虽然是null。根据文档,此方法:

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

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

我在这里做错了什么,更重要的是,我怎么能得到我的Annotation

4

4 回答 4

7

我刚刚为你测试了这个,它确实有效:

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 试过了。

于 2013-05-03T14:02:48.827 回答
2

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

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

于 2013-05-03T13:59:29.820 回答
0

就我而言,错误出现在我自己的注释中。我修复了几件事,最后结果是这样的:

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{
}

现在可以使用

于 2019-05-17T15:48:10.243 回答
0

就我而言,我忘记添加

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)

到方法,所以最后它应该看起来像:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
于 2021-03-31T21:53:20.333 回答