Mientras que la respuesta a la pregunta hecha es que Java de Method.getAnnotation()
no tiene en cuenta métodos sobrescritos, a veces es útil para encontrar estas anotaciones. He aquí una versión más completa de la respuesta de Saintali que actualmente estoy usando:
public static <A extends Annotation> A getInheritedAnnotation(
Class<A> annotationClass, AnnotatedElement element)
{
A annotation = element.getAnnotation(annotationClass);
if (annotation == null && element instanceof Method)
annotation = getOverriddenAnnotation(annotationClass, (Method) element);
return annotation;
}
private static <A extends Annotation> A getOverriddenAnnotation(
Class<A> annotationClass, Method method)
{
final Class<?> methodClass = method.getDeclaringClass();
final String name = method.getName();
final Class<?>[] params = method.getParameterTypes();
// prioritize all superclasses over all interfaces
final Class<?> superclass = methodClass.getSuperclass();
if (superclass != null)
{
final A annotation =
getOverriddenAnnotationFrom(annotationClass, superclass, name, params);
if (annotation != null)
return annotation;
}
// depth-first search over interface hierarchy
for (final Class<?> intf : methodClass.getInterfaces())
{
final A annotation =
getOverriddenAnnotationFrom(annotationClass, intf, name, params);
if (annotation != null)
return annotation;
}
return null;
}
private static <A extends Annotation> A getOverriddenAnnotationFrom(
Class<A> annotationClass, Class<?> searchClass, String name, Class<?>[] params)
{
try
{
final Method method = searchClass.getMethod(name, params);
final A annotation = method.getAnnotation(annotationClass);
if (annotation != null)
return annotation;
return getOverriddenAnnotation(annotationClass, method);
}
catch (final NoSuchMethodException e)
{
return null;
}
}
Además, trutheality, * I * buscado anteriormente pregunté, y se me ocurrió esta página. Felicidades, ahora eres parte de esos resultados de búsqueda. Es por eso que este sitio web está aquí. :) Además, tu respuesta es mucho más concisa que consultar ese documento. – Tustin2121
Una pregunta para ampliar esto ... si un marco encuentra el método basado en la anotación y luego lo invoca, ¿qué versión del método se invoca? El método de la clase infantil debe anular al padre, pero ¿se respeta eso con la invocación reflexiva? –