ReflectionUtils { public static PropertyDescriptor[] getPropertyDescriptors(Class<?> objectClass) { if (objectClass.isInterface()) { return getInterfacePropertyDescriptors(objectClass); } else { return PropertyUtils.getPropertyDescriptors(objectClass); } } private  ReflectionUtils(); static PropertyDescriptor findPropertyDescriptor(Class<?> objectClass, String fieldName,
                                                            HintContainer deepIndexHintContainer); static DeepHierarchyElement[] getDeepFieldHierarchy(Class<?> parentClass, String field,
                                                               HintContainer deepIndexHintContainer); static Method getMethod(Object obj, String methodName); static Method getMethod(Class<?> clazz, String methodName); static Method findAMethod(Class<?> clazz, String methodName, BeanContainer beanContainer); static PropertyDescriptor[] getPropertyDescriptors(Class<?> objectClass); static Field getFieldFromBean(Class<?> clazz, String fieldName); static Object invoke(Method method, Object obj, Object[] args); static Method getMethod(Class<?> clazz, String name, Class<?>[] parameterTypes); static T newInstance(Class<T> clazz); static Class<?> determineGenericsType(Class<?> parentClazz, PropertyDescriptor propDescriptor); static Class<?> determineGenericsType(Class<?> clazz, Method method, boolean isReadMethod); static Class<?> determineGenericsType(Type type); static Method getNonStandardSetter(Class<?> clazz, String fieldName);  }
@Test public void testGetPropertyDescriptors_InterfaceInheritance() { PropertyDescriptor[] pds = ReflectionUtils.getPropertyDescriptors(ChildChildIF.class); assertNotNull("prop descriptors should not be null", pds); assertEquals("3 prop descriptors should have been found", 3, pds.length); }