Могу ли я получить любое значение аннотации без имени аннотации?

Я хотел бы написать метод, который возвращает значение метода аннотации.

Я пытался использовать эти варианты, ничего не получилось

Параметры:

  • clazz - Класс с аннотациями
  • annotationClazz - Моя аннотация.класс
  • parametersName - имя метода

Это мой код:

public static Object getAnnotationValue(Class clazz, Class annotationClazz, String parametersName) {

    Annotation an = clazz.getAnnotation(annotationClazz);
    if (an.equals(null)) {
        throw new CoreError("Класс " + clazz + " не содержит аннотацию " + annotationClazz);
    }
    PageName pn = (PageName) an;

    try {
        //its working!
        System.out.println(pn.value());

        //not working :(
        System.out.println(an.getClass().getMethod(parametersName).getDefaultValue()); //not working :(
        System.out.println(an.annotationType().getDeclaredMethod(parametersName, annotationClazz).getDefaultValue());
        System.out.println(pn.getClass().getMethod(parametersName).getDefaultValue());
        System.out.println(pn.annotationType().getDeclaredMethod(parametersName, annotationClazz).getDefaultValue());
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
}

Это вообще возможно?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код продолжает искать значение По умолчанию, но в вашем вопросе никогда не упоминается, существует ли значение по умолчанию. Чтобы получить предоставленное значение, вы должны invoke использовать метод экземпляра.

Кроме того, в большинстве случаев вы неправильно используете getMethod и getDeclaredMethod.

Вот рабочий пример:

public static Object getAnnotationValue(Class clazz, Class annotationClazz, String parameterName) {

    Annotation an = clazz.getAnnotation(annotationClazz);
    System.out.println(an.annotationType().getMethod(parameterName).invoke(an));
}

Итак, для класса вроде:

@PageName("testPage") //Same as @PageName(value = "testPage")
public class Example {}

вызов

getAnnotationValue(Example.class, PageName.class, "value")

напечатал бы

testPage

Спасибо! Я не знал о "призыве". Это то, что мне нужно!

Kornext 10.04.2019 14:32

Другие вопросы по теме