/** * Get properties of the given type. Results are cached, so call as often as you want. * * @param klass The class to examine for properties. * @return A map of the property name, to an instance of the helper. */ public static Map<String, PropertyHelper> getFromClass(final Class<?> klass) { if (GLOBAL_PROPERTY_MAP.containsKey(klass)) { return GLOBAL_PROPERTY_MAP.get(klass); } final Map<String, PropertyHelper> propertyList = new LinkedHashMap<String, PropertyHelper>(); addHelpersFromFields(klass, propertyList, true); // but if there is a getter or setter in the super class for the private // field, it will be // detected in these // loops for (final Method method : klass.getMethods()) { final String methodName = method.getName(); if (methodName.startsWith("get") && method.getParameterTypes().length == 0) { final String propertyName = getPropertyNameFromMethodName(methodName); PropertyHelper prop = propertyList.get(propertyName); // make an attempt to look for the field final Field field = getField(klass, propertyName); if (prop == null) { prop = new PropertyHelper(field, method, null); propertyList.put(propertyName, prop); } else { prop.getter = method; prop.field = field; } } if (methodName.startsWith("set") && method.getParameterTypes().length == 1) { final String propertyName = getPropertyNameFromMethodName(methodName); PropertyHelper prop = propertyList.get(propertyName); // make an attempt to look for the field final Field field = getField(klass, propertyName); if (prop == null) { prop = new PropertyHelper(field, null, method); propertyList.put(propertyName, prop); } else { prop.setter = method; prop.field = field; } } } synchronized (GLOBAL_PROPERTY_MAP) { GLOBAL_PROPERTY_MAP.put(klass, propertyList); } return propertyList; }