Reflection getAnnotations() возвращает null

Searchable.java

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

Obj.java

public class Obj {
    @Searchable
    String myField;
}

void main (String [] args)

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

Я ожидаю, что annotations будет содержать мой @Searchable. Хотя это null. Согласно документации, этот метод:

Возвращает все аннотации, присутствующие в этом элементе. (Возвращает массив нулевой длины, если этот элемент не имеет аннотаций.) Вызывающий этого метода может свободно изменять возвращенный массив; это не повлияет на массивы, возвращенные другим абонентам.

Что еще более странно (для меня), так как он возвращает null вместо Annotation[0].

Что я делаю неправильно здесь и более важно, как я смогу получить свой Annotation?

Ответ 1

Я просто проверил это для вас, и он просто работает:

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.

Ответ 2

Ваш код верен. Проблема в другом месте. Я просто скопировал и запустил ваш код, и он работает.

Возможно, что вы импортируете неправильный класс Obj в свой код, который вы можете проверить первым.

Ответ 3

В моем случае ошибка была в моей собственной аннотации. Я исправил пару вещей, и в итоге все закончилось так:

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

Теперь работает