public static <A extends Object & Annotation> A findAnnotationOnProperty(Class<?> targetClass, String propertyName, Class<A> findingAnnotation) throws IntrospectionException {
        CLASS_LOOP:
        for (Class<?> clazz : linearize(targetClass)) {
            PropertyDescriptor[] descriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
            for (PropertyDescriptor descriptor : descriptors) {
                if (descriptor.getName().equals(propertyName)) {
                    Method readMethod = descriptor.getReadMethod();
                    if(readMethod == null) throw new IllegalStateException("the property '" + propertyName + "' does not have a getter method.");
                    A annotation = readMethod.getAnnotation(findingAnnotation);
                    if (annotation != null) {
                        return annotation;
                    } else {
                        continue CLASS_LOOP;
                    }
                }
            }
        }
        return null;
    }