Ответ 1
Вам нужно указать аннотацию как аннотацию Runtime, используя аннотацию @Retention в интерфейсе аннотации.
то есть.
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{}
Я пытаюсь использовать аннотации Java, но, похоже, не могу заставить мой код распознавать, что он существует. Что я делаю не так?
import java.lang.reflect.*;
import java.lang.annotation.*;
@interface MyAnnotation{}
public class FooTest
{
@MyAnnotation
public void doFoo()
{
}
public static void main(String[] args) throws Exception
{
Method method = FooTest.class.getMethod( "doFoo" );
Annotation[] annotations = method.getAnnotations();
for( Annotation annotation : method.getAnnotations() )
System.out.println( "Annotation: " + annotation );
}
}
Вам нужно указать аннотацию как аннотацию Runtime, используя аннотацию @Retention в интерфейсе аннотации.
то есть.
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{}
Короткий ответ: вам нужно добавить @Retention (RetentionPolicy.RUNTIME) в определение аннотации.
Пояснение:
Аннотации по умолчанию не хранятся в компиляторе. Они просто не существуют во время выполнения. Сначала это может показаться глупым, но есть много аннотаций, которые используются только компилятором (@Override) или различными анализаторами исходного кода (@Documentation и т.д.).
Если вы хотите фактически использовать аннотацию посредством отражения, как в вашем примере, вам нужно сообщить Java, что вы хотите, чтобы она заметила эту аннотацию в самом файле класса. Эта заметка выглядит следующим образом:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{}
Для получения дополнительной информации ознакомьтесь с официальными документами 1 и особенно обратите внимание на бит RetentionPolicy.
Используйте @Retention(RetentionPolicy.RUNTIME)
Проверьте приведенный ниже код. Он работает для меня:
import java.lang.reflect.*;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1{}
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{}
public class FooTest {
@MyAnnotation1
public void doFoo() {
}
@MyAnnotation2
public void doFooo() {
}
public static void main(String[] args) throws Exception {
Method method = FooTest.class.getMethod( "doFoo" );
for( Annotation annotation : method.getAnnotations() )
System.out.println( "Annotation: " + annotation );
method = FooTest.class.getMethod( "doFooo" );
for( Annotation annotation : method.getAnnotations() )
System.out.println( "Annotation: " + annotation );
}
}