Получить аннотацию по имени - PullRequest
2 голосов
/ 12 мая 2019

Я знаю, что можно получить класс по имени, используя

public String className = "someName";
public Class<?> c = Class.forName(className);

Можно ли получить аннотацию по имени? Я попробовал это:

public String annotationName = "someName";
public Class<?> c = Class.forName(annotationName);

А затем приведение c к Class<? extends Annotation>, что работает, но я получаю предупреждение о непроверенном приведении.

Я тоже пытался

public String annotationName = "someName";
public Class<? extends Annotation> c = Class.forName(annotationName);

Но когда я это делаю, я получаю ошибку

Incompatible types.
Required: Class<? extends java.lang.annotation.Annotation>
Found: Class<Capture<?>>

1 Ответ

3 голосов
/ 13 мая 2019

Использование asSubclass. В отличие от приведенных типов компилятором приведения типов, которые могут работать только с типами, известными во время компиляции, при этом выполняется проверка объекта Class, полученного во время выполнения. Поскольку это безопасно, оно не выдаст предупреждение «Не проверено». Обратите внимание на существование аналогичной операции cast для приведения экземпляра Class. Эти методы были добавлены в Java 5 специально для помощи коду с использованием Generics.

String annotationName = "java.lang.Deprecated";
Class<? extends Annotation> c = Class.forName(annotationName).asSubclass(Annotation.class);
boolean depr = Thread.class.getMethod("stop").isAnnotationPresent(c);
System.out.println(depr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...