Можно ли проверить во время выполнения, присутствует ли аннотация TYPE_USE на интерфейсе в объявлении орудия? - PullRequest
0 голосов
/ 29 марта 2020

Примите во внимание следующее:

class A implements @X B, C, @X D {}

Возможно ли во время выполнения получить, содержит ли объявление реализации @X на каждом из интерфейсов реализации?

Так в приведенном выше примере для B ответ - да, для C нет и для D - да.

Если это так, как бы я этого достиг?

1 Ответ

1 голос
/ 29 марта 2020

Да, это возможно с Class#getAnnotatedInterfaces().

Возвращает массив объектов AnnotatedType, представляющих использование типов для указания суперинтерфейсов объекта, представленного этим объектом Class. ( использует типа Foo для указания суперинтерфейса в '... Implements Foo' отличается от объявления типа Foo.)

[...]

Например:

package com.example;

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.AnnotatedType;

import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

public class Main {

  public static void main(String[] args) {
    for (AnnotatedType type : A.class.getAnnotatedInterfaces()) {
      System.out.println(type.getType());
      for (Annotation annotation : type.getAnnotations()) {
        System.out.println("\t" + annotation);
      }
      System.out.println();
    }
  }

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

  interface B {}
  interface C {}
  interface D {}

  static class A implements @X("Hello, ") B, C, @X("World!") D {}
}

Вывод:

interface com.example.Main$B
    @com.example.Main$X("Hello, ")

interface com.example.Main$C

interface com.example.Main$D
    @com.example.Main$X("World!")

Другие аналогичные методы включают в себя:

Обратите внимание, что AnnotatedType имеет такие подтипы, как AnnotatedParameterizedType. Этот последний интерфейс позволяет получить любые аннотации к аргументам типа:

Чтобы узнать, является ли AnnotatedType для экземпляра подтипа требуется тест instanceof (если вы точно не знаете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...