001    package com.mockrunner.util.common;
002    
003    import java.lang.reflect.Field;
004    import java.lang.reflect.Modifier;
005    import java.util.ArrayList;
006    import java.util.List;
007    
008    public class FieldUtil
009    {
010        /**
011         * Returns all non-static fields declared by the specified class and its
012         * superclasses. The returned array contains the methods of all classes
013         * in the inheritance hierarchy, starting with the methods of the
014         * most general superclass, which is <code>java.lang.Object</code>.
015         * @param theClass the class whose methods are examined
016         * @return the array of field arrays
017         */
018        public static Field[][] getFieldsSortedByInheritanceHierarchy(Class theClass)
019        {
020            List hierarchyList = new ArrayList();
021            Class[] hierarchyClasses = ClassUtil.getInheritanceHierarchy(theClass);
022            for(int ii = 0; ii < hierarchyClasses.length; ii++)
023            {
024                addFieldsForClass(hierarchyList, hierarchyClasses[ii]);
025            }
026            return (Field[][])hierarchyList.toArray(new Field[hierarchyList.size()][]);
027        }
028        
029        private static void addFieldsForClass(List hierarchyList, Class clazz)
030        {
031            List methodList = new ArrayList();
032            Field[] fields = clazz.getDeclaredFields();
033            for(int ii = 0; ii < fields.length; ii++)
034            {
035                if(!Modifier.isStatic(fields[ii].getModifiers()))
036                {
037                    methodList.add(fields[ii]);
038                }
039            }
040            hierarchyList.add(methodList.toArray(new Field[methodList.size()]));
041        }
042    }