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
}
Method
instance.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)
Deux choses importantes:
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());
}
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 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 ()]