Аннотации - это, в основном, биты данных, которые вы можете прикрепить к полям, методам, классам и т. Д.
Синтаксис объявления аннотаций в Java немного неудобен. Они немного похожи на интерфейсы (в конце концов, они объявлены с @interface
), но на самом деле они не являются интерфейсами. Я думаю, что вы могли бы поместить метод doTestTarget()
в свой класс TestAnnotations
, потому что вы думали, что ваша аннотация - это интерфейс, и вам нужно было его реализовать. Это не так - вы можете удалить этот метод и вызвать его из своего кода, если хотите, и это не вызовет у вас никаких проблем.
Кроме того, вы, возможно, не собирались помещать аннотацию в поле str
. Аннотации применяются только к тому, что следует за ними. В результате ваш код не компилируется, потому что вы применили аннотацию к полю, но объявили, что ваша аннотация может быть применена только к методам. Измените @Target(ElementType.METHOD)
на @Target(ElementType.FIELD)
, и ваш код должен скомпилироваться.
Что касается того, что происходит со строкой Hello World !
, она записывается в файл .class и доступна любому инструменту, который читает в классах Java. Однако он не обязательно будет доступен в JVM во время выполнения. Это происходит потому, что вы не указали @Retention
для аннотации @Test_Target
. Значение по умолчанию для @Retention
равно RetentionPolicy.CLASS
, что означает, что JVM может не загружать их из файла класса. (См. Javadoc для перечисления RetentionPolicy .)
Я полагаю, вы хотите увидеть какой-нибудь способ чтения значения из этой аннотации во время выполнения. Если это так, я бы рекомендовал добавить @Retention(RetentionPolicy.RUNTIME)
к аннотации, чтобы убедиться, что она будет доступна во время выполнения.
Чтобы получить доступ к аннотации и значению, содержащемуся в ней во время выполнения, вам нужно использовать отражение. Я переписал ваш класс TestAnnotations
следующим образом для быстрой демонстрации:
import java.lang.reflect.Field;
public class TestAnnotations {
@Test_Target(doTestTarget="Hello World !")
private String str;
public static void main(String[] args) throws Exception {
// We need to use getDeclaredField here since the field is private.
Field field = TestAnnotations.class.getDeclaredField("str");
Test_Target ann = field.getAnnotation(Test_Target.class);
if (ann != null) {
System.out.println(ann.doTestTarget());
}
}
}
Когда я запускаю этот код, он дает мне следующий вывод:
Hello World !