Получить значение элемента по умолчанию из аннотации в Java

Я создал свою собственную аннотацию, которую я использую через отражение, чтобы принять решение в моем коде. Аннотации имеют значение по умолчанию, установленное для его единственного элемента. Есть ли способ получить доступ к значению по умолчанию через отражение?

PageableRequestMapping.java(Аннотация)

package org.tothought.controllers.annotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface PageableRequestMapping {
    String variablePath() default "/";
}

Код Psuedo для получения значения по умолчанию

private int parsePageNumber(StringBuffer requestURL,
        PageableRequestMapping pageableRequestMapping) {

        String variablePath = pageableRequestMapping.variablePath();

    //Psuedo code doesn't work in Java, included to illustrate intentions   
        if(variablePath.equalsIgnoreCase(pageableRequestMapping.variablePath().default())){
           //handle default case    
        }else{
          //handle different case
        }
        return 0;
}

Мои исследования проблемы не привели примеров. Я предположил, что это значение можно получить статическим образом через класс, но это невозможно. Поэтому у меня остались два вопроса.

  • Можно ли получить значение по умолчанию для элемента в аннотации?
  • Если да, то как?

Кроме того, я знаю, что я мог бы жестко кодировать это значение, однако я хотел бы сделать программу немного более надежной.

Ответ 1

Вы можете использовать отражение для получения объекта Method, а затем использовать Method#getDefaultValue().

Method method = pageableReqMapping.annotationType().getMethod("variablePath");
String variablePath = (String) method.getDefaultValue();

Вот конкретный пример:

public class AnnotationTest {

  public static void main(String[] args) throws Exception {
    Class<?> clazz = Annotation.class;
    Method method = clazz.getDeclaredMethod("value");
    String value = (String) method.getDefaultValue();
    System.out.println(value);
  }

  public @interface Annotation {
    String value() default "default value";
  }
}

Ответ 2

Вы можете сделать это таким образом, применив свою аннотацию к классу и извлеките ее из класса через отражение:

@PageableRequestMapping
class MyUtilClass{
}


public String getDefaultValue(){
    PageableRequestMapping pageableRequestMapping = MyUtilClass.class.getAnnotation(PageableRequestMapping.class);
    return pageableRequestMapping.variablePath();
}