web-dev-qa-db-fra.com

Récupérer Java Attribut d'annotation

Comment puis-je récupérer la valeur d'une annotation sur la méthode annotée ??

J'ai:

@myAnnotation(attribute1 = value1, attibute2 = value2)
public void myMethod()
{
  //I want to get value1 here
}
38
Diego Dias
  1. Obtenez Method instance.
  2. Obtenez une annotation.
  3. Obtenez la valeur d'attribut d'annotation.

Quelque chose comme:

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

Vous devrez bien sûr intercepter/gérer les exceptions appropriées. Ce qui précède suppose que vous récupérez bien la méthode de la classe actuelle (remplacez getClass() par Class.forName() sinon) et la méthode en question est publique (utilisez getDeclaredMethods() si ce n'est pas le cas l'affaire)

51
ChssPly76

Deux choses importantes:

  • Il n'y a aucun moyen d'obtenir la méthode actuelle, par ex. il n'y a pas de getMethod () comme getClass (). Par conséquent, la méthode accédant à sa propre annotation devrait connaître son propre nom.
  • politique de rétention de l'annotation doit être définie sur RUNTIME, afin que vous puissiez accéder à l'annotation au moment de l'exécution. La valeur par défaut est au moment de la compilation, ce qui signifie que les annotations sont disponibles dans le fichier de classe, mais ne sont pas accessibles lors de l'exécution à l'aide de la réflexion.

Exemple complet:

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

Pour obtenir la méthode actuelle, essayez d'utiliser ce code:

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

@mhaller: un peu trop longtemps pour un commentaire sur votre post. De toute évidence, il faudrait affiner davantage les méthodes surchargées, mais ce n'est pas impossible .:

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édit/merci à Alexandr Priymak pour avoir repéré l'erreur dans main ()]

1
alphazero