获取随便java类实例的方法和属性,包括父类的方法和属性

获取任意java类实例的方法和属性,包括父类的方法和属性
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取任意java类实例的方法和属性,包括父类的方法和属性
 * @author weishaoxiang
 */
public class Student extends School
{
	
	private String			code;
	private String			name;
	private Date			birthday;
	private int				age;
	private int				classNumber;
	private boolean			isGoodStudent;
	private List< School >	sch;
	private School			sch1	= new School ( );
	
	/**
	 * 测试
	 * @param args
	 */
	public static void main ( String[] args )
	{
		Student student = new Student ( );
		// 获取属性
		Map< String, Class > map = getClassFields ( student.getClass ( ), true );
		for ( Object key : map.keySet ( ) )
		{
			System.out.println ( "<field=" + key.toString ( ) + "> <Type=" + map.get ( key ) + ">" );
		}
		// 获取方法
		List< Method > methods = getMothds ( student.getClass ( ), true );
		for ( Method method : methods )
		{
			System.out.println ( method.getName ( ) );
		}
		System.out.println ( "方法总数:" + methods.size ( ) );
	}
	
	/**
	 * 获取类实例的属性值
	 * @param clazz
	 *            类名
	 * @param includeParentClass
	 *            是否包括父类的属性值
	 * @return 类名.属性名=属性类型
	 */
	public static Map< String, Class > getClassFields ( Class clazz, boolean includeParentClass )
	{
		Map< String, Class > map = new HashMap< String, Class > ( );
		Field[] fields = clazz.getDeclaredFields ( );
		for ( Field field : fields )
		{
			map.put ( clazz.getName ( ) + "." + field.getName ( ), field.getType ( ) );
		}
		if ( includeParentClass )
			getParentClassFields ( map, clazz.getSuperclass ( ) );
		return map;
	}
	
	/**
	 * 获取类实例的父类的属性值
	 * @param map
	 *            类实例的属性值Map
	 * @param clazz
	 *            类名
	 * @return 类名.属性名=属性类型
	 */
	private static Map< String, Class > getParentClassFields ( Map< String, Class > map, Class clazz )
	{
		Field[] fields = clazz.getDeclaredFields ( );
		for ( Field field : fields )
		{
			map.put ( clazz.getName ( ) + "." + field.getName ( ), field.getType ( ) );
		}
		if ( clazz.getSuperclass ( ) == null )
		{
			return map;
		}
		getParentClassFields ( map, clazz.getSuperclass ( ) );
		return map;
	}
	
	/**
	 * 获取类实例的方法
	 * @param clazz
	 *            类名
	 * @param includeParentClass
	 *            是否包括父类的方法
	 * @return List
	 */
	public static List< Method > getMothds ( Class clazz, boolean includeParentClass )
	{
		List< Method > list = new ArrayList< Method > ( );
		Method[] methods = clazz.getDeclaredMethods ( );
		for ( Method method : methods )
		{
			list.add ( method );
		}
		if ( includeParentClass )
		{
			getParentClassMothds ( list, clazz.getSuperclass ( ) );
		}
		return list;
	}
	
	/**
	 * 获取类实例的父类的方法
	 * @param list
	 *            类实例的方法List
	 * @param clazz
	 *            类名
	 * @return List
	 */
	private static List< Method > getParentClassMothds ( List< Method > list, Class clazz )
	{
		Method[] methods = clazz.getDeclaredMethods ( );
		for ( Method method : methods )
		{
			list.add ( method );
		}
		if ( clazz.getSuperclass ( ) == Object.class )
		{
			return list;
		}
		getParentClassMothds ( list, clazz.getSuperclass ( ) );
		return list;
	}
	
	public int getAge ( )
	{
		return age;
	}
	
	public void setAge ( int age )
	{
		this.age = age;
	}
}

class Country
{
	
	private String	countryName;
	private long	peopleNumber;
	
	public long getPeopleNumber ( )
	{
		return peopleNumber;
	}
	
	public void setPeopleNumber ( long peopleNumber )
	{
		this.peopleNumber = peopleNumber;
	}
}

class School extends Country
{
	
	private String	schoolName;
	private String	address;
	
	public String getAddress ( )
	{
		return address;
	}
	
	public void setAddress ( String address )
	{
		this.address = address;
	}
}