public static List getDeclaredMethods(Class targetClass, String propertyName, boolean findSets)
    {
        List result = null;
        ClassCache cache = _declaredMethods[findSets ? 0 : 1];

        Map propertyCache = (Map) cache.get(targetClass);
        if ((propertyCache == null) || ((result = (List) propertyCache.get(propertyName)) == null)) {
            synchronized (cache) {
                propertyCache = (Map) cache.get(targetClass);

                if ((propertyCache == null) || ((result = (List) propertyCache.get(propertyName)) == null)) {

                    String baseName = capitalizeBeanPropertyName(propertyName);

                    for (Class c = targetClass; c != null; c = c.getSuperclass()) {
                        Method[] methods = c.getDeclaredMethods();

                        for (int i = 0; i < methods.length; i++) {

                            if (!isMethodCallable(methods[i]))
                                continue;

                            String ms = methods[i].getName();

                            if (ms.endsWith(baseName)) {
                                boolean isSet = false, isIs = false;

                                if ((isSet = ms.startsWith(SET_PREFIX)) || ms.startsWith(GET_PREFIX)
                                    || (isIs = ms.startsWith(IS_PREFIX))) {
                                    int prefixLength = (isIs ? 2 : 3);

                                    if (isSet == findSets) {
                                        if (baseName.length() == (ms.length() - prefixLength)) {
                                            if (result == null) {
                                                result = new ArrayList();
                                            }
                                            result.add(methods[i]);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (propertyCache == null) {
                        cache.put(targetClass, propertyCache = new HashMap(101));
                    }

                    propertyCache.put(propertyName, (result == null) ? NotFoundList : result);
                }
            }
        }
        return (result == NotFoundList) ? null : result;
    }