Как получить аннотацию типа java по отражению - PullRequest
0 голосов
/ 06 февраля 2020

Согласно 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>
  }
}

1 Ответ

2 голосов
/ 06 февраля 2020

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

Вместо этого вы хотите либо создать плагин компилятора, который может это прочитать, либо добавить слушатель задачи внутри процессора аннотаций - см. { ссылка } для обсуждения этого вопроса. После того как вы это сделали и можете прочитать аннотацию, вы можете сгенерировать новый код, к которому вы могли бы затем обращаться во время выполнения, и делать то, что вы хотите, здесь.

...