Language Basics Java

//package com.witframework.util;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * Obtains all property descriptors from a bean (interface or implementation).
 * 


 * The java.beans.Introspector does not process the interfaces hierarchy chain, this one does.
 * 


 * @author Alejandro Abdelnur
 *
 */
public class BeanIntrospector {
    private static final Map _introspected = new HashMap();
    public static synchronized PropertyDescriptor[] getPropertyDescriptors(Class klass) throws IntrospectionException {
        PropertyDescriptor[] descriptors = (PropertyDescriptor[]) _introspected.get(klass);
        if (descriptors==null) {
            descriptors = getPDs(klass);
            _introspected.put(klass,descriptors);
        }
        return descriptors;
    }
    private static PropertyDescriptor[] getPDs(Class klass) throws IntrospectionException {
        Method[] methods = klass.getMethods();
        Map getters = getPDs(methods,false);
        Map setters = getPDs(methods,true);
        List pds     = merge(getters,setters);
        PropertyDescriptor[] array = new PropertyDescriptor[pds.size()];
        pds.toArray(array);
        return array;
    }
    private static final String SETTER = "set";
    private static final String GETTER = "get";
    private static final String BOOLEAN_GETTER = "is";
    private static Map getPDs(Method[] methods,boolean setters) throws IntrospectionException {
        Map pds = new HashMap();
        for (int i=0;i            String pName = null;
            PropertyDescriptor pDescriptor = null;
            if ((methods[i].getModifiers()&Modifier.PUBLIC)!=0) {
                if (setters) {
                    if (methods[i].getName().startsWith(SETTER) &&
                        methods[i].getReturnType()==void.class && methods[i].getParameterTypes().length==1) {
                        pName = Introspector.decapitalize(methods[i].getName().substring(3));
                        pDescriptor = new PropertyDescriptor(pName,null,methods[i]);
                    }
                }
                else {
                    if (methods[i].getName().startsWith(GETTER) &&
                        methods[i].getReturnType()!=void.class && methods[i].getParameterTypes().length==0) {
                        pName = Introspector.decapitalize(methods[i].getName().substring(3));
                        pDescriptor = new PropertyDescriptor(pName,methods[i],null);
                    }
                    else
                    if (methods[i].getName().startsWith(BOOLEAN_GETTER) &&
                        methods[i].getReturnType()==boolean.class && methods[i].getParameterTypes().length==0) {
                        pName = Introspector.decapitalize(methods[i].getName().substring(2));
                        pDescriptor = new PropertyDescriptor(pName,methods[i],null);
                    }
                }
            }
            if (pName!=null) {
                pds.put(pName,pDescriptor);
            }
        }
        return pds;
    }
    private static List merge(Map getters,Map setters) throws IntrospectionException {
        List props = new ArrayList();
        Set processedProps = new HashSet();
        Iterator gs = getters.keySet().iterator();
        while (gs.hasNext()) {
            String name = (String) gs.next();
            PropertyDescriptor getter = (PropertyDescriptor) getters.get(name);
            PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);
            if (setter!=null) {
                processedProps.add(name);
                PropertyDescriptor prop = new PropertyDescriptor(name,getter.getReadMethod(),setter.getWriteMethod());
                props.add(prop);
            }
            else {
                props.add(getter);
            }
        }
        Set writeOnlyProps = new HashSet(setters.keySet());
        writeOnlyProps.removeAll(processedProps);
        Iterator ss = writeOnlyProps.iterator();
        while (ss.hasNext()) {
            String name = (String) ss.next();
            PropertyDescriptor setter = (PropertyDescriptor) setters.get(name);
            props.add(setter);
        }
        return props;
    }
}