Как я узнаю аннотации класса Java?

Мне нужно знать аннотации класса Java. Я использую Ломбок.

Образец:

@Data
@Builder
public class JavaBean {}

Я попробовал java.lang.annotation.Annotation[] annotation = JavaBean.class.getAnnotations, но он не показывает данные и построитель.


person Erick Del Rey    schedule 17.10.2018    source источник
comment
@Data генерирует весь шаблон, который обычно связан с простыми POJO (обычными старыми объектами Java) и bean-компонентами: геттеры для всех полей, сеттеры для всех неконечных полей и соответствующие toString, equals и hashCode   -  person Khalid Shah    schedule 17.10.2018
comment
для @Builder см. projectlombok.org/api/lombok/Builder.html   -  person Khalid Shah    schedule 17.10.2018


Ответы (3)


Я думаю, вы не можете видеть аннотации в JavaBean.class.getAnnotations, потому что @Retention равно SOURCE.

Этот тип аннотаций не требуется во время выполнения.

Подробнее: Политика хранения ИСТОЧНИКА АННОТАЦИИ

Хорошего дня.

person Sodala    schedule 17.10.2018

Ответ находится в источнике этих аннотаций:

@Target({TYPE, METHOD, CONSTRUCTOR})
@Retention(SOURCE)
public @interface Builder {
.....

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
.....

Ваш код для получения аннотации правильный, но здесь играет роль @Retention(RetentionPolicy.SOURCE).

Java определила 3 ​​типа политик хранения через перечисление java.lang.annotation.RetentionPolicy. У него есть SOURCE, CLASS и RUNTIME.

1) Аннотация с политикой хранения SOURCE будет сохранена только с исходным кодом и удалена во время компиляции.

2) Аннотация с политикой хранения CLASS будет сохранена до компиляции кода и удалена во время выполнения.

3) Аннотация с политикой хранения RUNTIME будет доступна для JVM во время выполнения.

@Data и @Builder отмечены @Retention(SOURCE), что означает, что эти аннотации отсутствуют во время выполнения вашего класса, поэтому вы не можете получить эти аннотации.

person DhaRmvEEr siNgh    schedule 17.10.2018
comment
И для этого есть веская причина в случае с Lombok: вы не хотите, чтобы каждый проект, который вы создаете с его помощью, имел зависимости времени выполнения от jar-файлов Lombok. - person biziclop; 17.10.2018
comment
@biziclop также цель этих аннотаций достигается сразу после компиляции кода (результат в сгенерированном коде, который ожидается этими аннотациями), поэтому нет смысла сохранять то же самое во время выполнения. Пожалуйста, поправьте меня, если я ошибаюсь. - person DhaRmvEEr siNgh; 17.10.2018
comment
Это тоже абсолютно верно. Я просто подумал, что кто-то может спросить Да, но почему мы все равно не можем оставить аннотации? И ответ заключается в том, что если бы они сохранялись до времени выполнения, вы не могли бы загружать классы без JAR с аннотациями Lombok в пути к классам. - person biziclop; 17.10.2018

Аннотации Lombok предварительно обрабатываются перед фактической компиляцией, поэтому скомпилированные классы содержат их не как аннотацию, а как уже сгенерированный код.

person Michael Bláha    schedule 17.10.2018