Here you can find the source of getAnnotation(Class> cls, Class annotationClass)
public static <A extends Annotation> A getAnnotation(Class<?> cls, Class<A> annotationClass)
//package com.java2s; //License from project: Apache License import java.lang.annotation.Annotation; import java.lang.reflect.*; public class Main { /**// w ww .j av a 2 s .c om * Returns an annotation by type from a method. * * @param method is the method to find * @param annotationClass is the type of annotation * @param <A> is the type of annotation * @return annotation if it is found */ public static <A extends Annotation> A getAnnotation(Method method, Class<A> annotationClass) { A annotation = method.getAnnotation(annotationClass); if (annotation == null) { Method superclassMethod = getOverriddenMethod(method); if (superclassMethod != null) { annotation = getAnnotation(superclassMethod, annotationClass); } } return annotation; } public static <A extends Annotation> A getAnnotation(Class<?> cls, Class<A> annotationClass) { A annotation = cls.getAnnotation(annotationClass); if (annotation == null) { Class<?> superClass = cls.getSuperclass(); if (superClass != null && !(superClass.equals(Object.class))) { annotation = getAnnotation(superClass, annotationClass); } } if (annotation == null) { for (Class<?> anInterface : cls.getInterfaces()) { annotation = getAnnotation(anInterface, annotationClass); if (annotation != null) { return annotation; } } } return annotation; } /** * Returns overridden method from superclass if it exists. If method was not found returns null. * * @param method is method to find * @return overridden method from superclass */ public static Method getOverriddenMethod(Method method) { Class<?> declaringClass = method.getDeclaringClass(); Class<?> superClass = declaringClass.getSuperclass(); Method result = null; if (superClass != null && !(superClass.equals(Object.class))) { result = findMethod(method, superClass); } if (result == null) { for (Class<?> anInterface : declaringClass.getInterfaces()) { result = findMethod(method, anInterface); if (result != null) { return result; } } } return result; } /** * Searches the method methodToFind in given class cls. If the method is found returns it, else return null. * * @param methodToFind is the method to search * @param cls is the class or interface where to search * @return method if it is found */ public static Method findMethod(Method methodToFind, Class<?> cls) { String methodToSearch = methodToFind.getName(); Class<?>[] soughtForParameterType = methodToFind.getParameterTypes(); Type[] soughtForGenericParameterType = methodToFind.getGenericParameterTypes(); for (Method method : cls.getMethods()) { if (method.getName().equals(methodToSearch) && method.getReturnType().isAssignableFrom(methodToFind.getReturnType())) { Class<?>[] srcParameterTypes = method.getParameterTypes(); Type[] srcGenericParameterTypes = method.getGenericParameterTypes(); if (soughtForParameterType.length == srcParameterTypes.length && soughtForGenericParameterType.length == srcGenericParameterTypes.length) { if (hasIdenticalParameters(srcParameterTypes, soughtForParameterType, srcGenericParameterTypes, soughtForGenericParameterType)) { return method; } } } } return null; } private static boolean hasIdenticalParameters(Class<?>[] srcParameterTypes, Class<?>[] soughtForParameterType, Type[] srcGenericParameterTypes, Type[] soughtForGenericParameterType) { for (int j = 0; j < soughtForParameterType.length; j++) { Class<?> parameterType = soughtForParameterType[j]; if (!(srcParameterTypes[j].equals(parameterType) || (!srcGenericParameterTypes[j].equals(soughtForGenericParameterType[j]) && srcParameterTypes[j].isAssignableFrom(parameterType)))) { return false; } } return true; } }