Question

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
}
Était-ce utile?

La solution

  1. Obtenir la , méthode instance.
  2. Obtenir une annotation.
  3. Obtenir la valeur d'attribut d'annotation.

Quelque chose comme:

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

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

Autres conseils

Deux choses importantes:

  • Il n'y a aucun moyen d'obtenir la méthode actuelle , par exemple. Il n'y a pas de méthode getMethod () telle que getClass (). Par conséquent, la méthode accédant à sa propre annotation devra 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 compile-time, ce qui signifie que les annotations sont disponibles dans le fichier de classe, mais qu’elles ne sont pas accessibles au moment 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());
}

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

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

@mhaller: un peu trop long pour un commentaire sur votre post. De toute évidence, des améliorations seraient nécessaires pour traiter 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;
    }
}

[modifier: crédit / merci à Alexandr Priymak pour avoir repéré l'erreur dans main ()]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top