Pergunta

Como posso recuperar o valor de uma anotação no método anotado ??

Eu tenho:

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

Solução

  1. Method instância.
  2. Obter anotação.
  3. Obter valor do atributo de anotação.

Algo como:

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

Você precisa catch / lidar com as devidas excepções, claro. O acima assume que você está de fato recuperar método da classe atual (substitua getClass() com Class.forName() outra forma) e o método em questão é pública (uso getDeclaredMethods() se isso não for o caso)

Outras dicas

Duas coisas importantes:

  • Não nenhuma maneira de obter o método atual , por exemplo, não há getMethod () tal como getClass (). Portanto, o método acessando seu próprio anotação precisa saber o seu próprio nome.
  • A política retenção da anotação deve ser definido como RUNTIME, para que possa acessar a anotação em tempo de execução. O padrão é tempo de compilação, o que significa que as anotações estão disponíveis no arquivo de classe, mas não podem ser acessados ??em tempo de execução usando reflexão.

exemplo completa:

@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());
}

Para obter o método atual, tente usar este código:

Thread.currentThread().getStackTrace()[1].getClassName().toString()+\".\"+Thread.currentThread().getStackTrace()[1].getMethodName().toString()

@mhaller: um pouco longo demais para um comentário no seu post. Obviamente seria necessário aperfeiçoamento para lidar com métodos sobrecarregados, mas não é impossível:.

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;
    }
}

[edit: crédito / graças a Alexandr Priymak para detectar o erro no main ()]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top