Получить атрибут аннотации Java - PullRequest
37 голосов
/ 26 ноября 2009

Как я могу получить значение аннотации для аннотированного метода ??

У меня есть:

@myAnnotation(attribute1 = value1, attibute2 = value2)
public void myMethod()
{
  //I want to get value1 here
}

Ответы [ 4 ]

51 голосов
/ 26 ноября 2009
  1. Получить Method экземпляр.
  2. Получить аннотацию.
  3. Получить значение атрибута аннотации.

Что-то вроде:

Method m = getClass().getMethod("myMethod");
MyAnnotation a = m.getAnnotation(MyAnnotation.class);
MyValueType value1 = a.attribute1();

Вам, конечно, нужно будет отловить / обработать соответствующие исключения. Выше предполагается, что вы действительно извлекаете метод из текущего класса (замените getClass() на Class.forName() в противном случае), а рассматриваемый метод является общедоступным (используйте getDeclaredMethods(), если это не так)

22 голосов
/ 26 ноября 2009

Две важные вещи:

  • Нет способа получить текущий метод , например, нет. нет getMethod (), такого как getClass (). Следовательно, метод, обращающийся к собственной аннотации, должен знать свое имя.
  • Политика хранения аннотации должна быть установлена ​​на RUNTIME, чтобы вы могли получить доступ к аннотации во время выполнения. По умолчанию используется время компиляции, что означает, что аннотации доступны в файле класса, но недоступны во время выполнения с помощью отражения.

Полный пример:

@Retention(RetentionPolicy.RUNTIME)
public static @interface MyAnnotation {
    String value1();

    int value2();
}

@Test
@MyAnnotation(value1 = "Foo", value2 = 1337)
public void testAnnotation() throws Exception {
    Method[] methods = getClass().getMethods();
    Method method = methods[0];
    assertEquals("testAnnotation", method.getName());
    MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
    assertEquals("Foo", annotation.value1());
    assertEquals(1337, annotation.value2());
}
2 голосов
/ 19 января 2017

Чтобы получить текущий метод, попробуйте использовать этот код:

Thread.currentThread().getStackTrace()[1].getClassName().toString()+\".\"+Thread.currentThread().getStackTrace()[1].getMethodName().toString()
1 голос
/ 26 ноября 2009

@ mhaller: слишком долго для комментария к вашему посту. Очевидно, что потребуется дополнительная доработка для работы с перегруженными методами, но это не невозможно.

import java.lang.reflect.Method;

public class Hack {
    public static void main (String[] args) {
        (new Hack()).foobar();
    }
    public void foobar () {
        Method here = getCurrentMethod(this);
        System.out.format("And here we are: %s\n", here);
    }
    public static final Method getCurrentMethod(Object o) {
        String s = Thread.currentThread().getStackTrace()[2].getMethodName();
        Method cm = null;
        for(Method m : o.getClass().getMethods()){
            if(m.getName().equals(s)){
                cm = m; break;
            }
        }
        return cm;
    }
}

[редактировать: кредит / спасибо Александру Приймаку за обнаружение ошибки в main ()]

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