2011-04-29 14 views
5

Tengo 2 tipos de anotación Java, digamos XA y YA. Ambos tienen algún método(). Analizo el código fuente y recupero el objeto Anotación. Ahora me gustaría dinámicamente lanzar la anotación al tipo real de ella para poder llamar al método(). ¿Cómo puedo hacerlo sin la declaración instanceof? Realmente quiero evitar la fuente de conmutación. Necesito algo como esto:Java anotación tipografía dinámica

Annotation annotation = getAnnotation(); // I recieve the Annotation object here 
String annotationType = annotation.annotationType().getName(); 

?_? myAnnotation = (Class.forName(annotationType)) annotation; 
annotation.method(); // this is what I need, get the method() called 

? _? significa que no tengo idea de cuál sería mi tipo de anotación. No puedo usar la clase base para mis anotaciones XA y YA, ya que la herencia en las anotaciones no está permitida. ¿O es posible hacerlo de alguna manera?

Gracias por cualquier sugerencia o ayuda.

Respuesta

6

¿Por qué no utiliza la forma segura para recuperar su anotación?

final YourAnnotationType annotation = classType.getAnnotation(YourAnnotationType.class); 
annotation.yourMethod(); 

Si su anotación no puede ser encontrada, se devuelve null.

Tenga en cuenta que esto también funciona con campos y métodos.

+0

Esto también funciona con métodos y campos. –

+1

Esto no resuelve mi problema. Necesito declarar esta línea para cada MyAnnotationType que uso. classType.getAnnotation (YourAnnotationType.class); Entonces volverá a parecerse al interruptor. –

5

Una forma es para invocar el método dinámicamente usando el nombre de ella:

Annotation annotation = getAnnotation(); 
Class<? extends Annotation> annotationType = annotation.annotationType(); 
Object result = annotationType.getMethod("method").invoke(annotation); 

Este enfoque es muy arriesgado y comprometer totalmente la refactorización de código si es necesario.

+0

Funciona muy bien! La forma en que obtenía el atributo de nombre de una anotación '@ Table', era extrayendo el nombre de la tabla de' annotation.toSring() 'usando algunas expresiones regulares simples, pero su solución es más elegante. –