Récupérer L'Attribut D'Annotation Java

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
}
33
demandé sur Tim Büthe 2009-11-26 22:00:56

4 réponses

  1. Obtenir Method exemple.
  2. obtenir une annotation.
  3. obtenir la valeur de l'attribut d'annotation.

Quelque Chose comme:

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

Vous aurez besoin d'attraper / Gérer les exceptions appropriées, bien sûr. 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)

48
répondu ChssPly76 2009-11-26 19:39:45

Deux choses importantes:

  • Il est aucun moyen d'obtenir la méthode actuelle, par exemple, 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.
  • La stratégie 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 la compilation, ce qui signifie que les annotations sont disponibles dans le fichier de classe, mais ne peuvent pas être accessibles lors de l'exécution en utilisant 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());
}
19
répondu mhaller 2009-11-26 19:32:31

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

Thread.currentThread().getStackTrace()[1].getClassName().toString()+\".\"+Thread.currentThread().getStackTrace()[1].getMethodName().toString()
2
répondu s s 2017-01-19 12:22:11

@mhaller: un peu trop long pour un commentaire sur votre poste. De toute évidence aurait besoin d'un raffinement supplémentaire pour faire face à des méthodes surchargées, mais il 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
répondu alphazero 2012-10-19 14:17:27