Как получить аннотацию функционала типа java с помощью отражения

Согласно JSR 308 (аннотации типов Java) можно аннотировать любой тип с помощью ElementType.TYPE_USE:

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Target({ TYPE_USE })
@Retention(RUNTIME)
public @interface MyAnnotation {
  String value();
}

Как получить аннотированное значение из функции во время выполнения?

import java.util.function.Consumer;

import org.junit.Assert;
import org.junit.Test;

public class TestFunctionAnnotation {
  @Test
  public void test() {
    Consumer<TestFunctionAnnotation> fun = @MyAnnotation("NoJoke") TestFunctionAnnotation::test;
    Assert.assertEquals("NoJoke", fun.getClass().getAnnotatedSuperclass().getAnnotation(MyAnnotation.class)); 
   // expected:<NoJoke> but was:<null>
  }
}

person jukzi    schedule 06.02.2020    source источник
comment
дубликат: stackoverflow.com/questions/22375891/   -  person jukzi    schedule 09.02.2020


Ответы (1)


Ваш @MyAnnotation отображается не в классе или методе, а в использовании типа - то, о чем вы не можете подумать. Вместо этого вам понадобится гипотетическое «отражение», которое могло бы исследовать сам код, а не только структуру типов.

Вместо этого вы хотите либо создать подключаемый модуль компилятора, который может это читать, либо добавить прослушиватель задач внутри обработчика аннотаций - см. https://stackoverflow.com/a/55288602/860630 для обсуждения этого вопроса. Как только вы это сделаете и сможете прочитать аннотацию, вы можете сгенерировать новый код, к которому вы сможете получить доступ во время выполнения, и делать все, что вам нужно здесь.

person Colin Alworth    schedule 06.02.2020