Während die Antwort auf die Frage, wie ist darum gebeten, dass die Java Method.getAnnotation()
nicht überschriebenen Methoden nicht berücksichtigt, ist es manchmal nützlich, um diese Anmerkungen zu finden. Hier ist eine vollständigere Version von Saintali Antwort, die ich zur Zeit mit:
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;
}
}
Auch trutheality, * ich gesucht *, bevor ich fragte, und ich habe diese Seite gefunden. Herzlichen Glückwunsch, Sie sind jetzt Teil dieser Suchergebnisse. Deshalb ist diese Website hier. :) Auch Ihre Antwort ist viel prägnanter als das Durchsehen dieses Dokuments. – Tustin2121
Eine Frage, die das weitergibt ... Wenn ein Framework die Methode findet, die auf der Annotation basiert, und sie dann aufruft, welche Version der Methode wird aufgerufen? Die Methode der Kindklasse sollte die Elternklasse außer Kraft setzen, aber wird diese bei der reflektiven Invokation beachtet? –