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{
}
Теперь работает