suppresswarnings son sirven sirve que para las introspección ejemplos ejemplo crear anotaciones annotation java annotations

java - son - para que sirven las anotaciones



Recuperar el atributo de anotación de Java (4)

¿Cómo puedo recuperar el valor de una anotación en el método anotado?

Yo tengo:

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


  1. Obtener instancia de Method
  2. Obtener anotación
  3. Obtener el valor del atributo de anotación.

Algo como:

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

Necesitarás capturar / manejar las excepciones apropiadas, por supuesto. Lo anterior asume que de hecho estás recuperando el método de la clase actual (reemplaza getClass() con Class.forName() contrario) y el método en cuestión es público (usa getDeclaredMethods() si ese no es el caso)


@mhaller: un poco demasiado largo para un comentario en tu publicación. Obviamente necesitaría un mayor refinamiento para tratar con métodos sobrecargados, pero no es imposible.

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

[edit: crédito / gracias a Alexandr Priymak por detectar el error en main ()]


Dos cosas importantes:

  • No hay forma de obtener el método actual , por ejemplo, no hay getMethod () como getClass (). Por lo tanto, el método de acceso a su propia anotación necesitaría saber su propio nombre.
  • La política de retención de la anotación debe establecerse en RUNTIME , para que pueda acceder a la anotación en el tiempo de ejecución. El valor predeterminado es el tiempo de compilación, lo que significa que las anotaciones están disponibles en el archivo de la clase, pero no se puede acceder en tiempo de ejecución mediante la reflexión.

Ejemplo completo:

@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 obtener el método actual, intente utilizar este código:

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