首先需要一个被测试的类,,这个类需要有属性和方法,并且这些属性和方法需要有不同权限修饰符
	
	
package com.memorycat.aoptest.reflect;
public class Reflect1 {
	private int id;
	protected String myName;
	public Reflect1() {
		super();
		System.out.println("正在执行方法:public Reflect1() <- 默认构造方法");
	}
	private void foo1() {
		System.out.println("正在执行方法:private void foo1()");
	}
	public void foo2() {
		System.out.println("正在执行方法:public void foo2()");
	}
	public void printAttr() {
		System.out.println("正在执行方法: printAttr() -> [id=" + id + ", myName="
				+ myName + "]");
	}
	int add(int num1, int num2) {
		return num1 + num2;
	}
	int add(int num1, int num2, int num3) {
		return num1 + num2 + num3;
	}
}
	
	
然后,随便写一个测试类,从反射得到被测试类的各种属性和方法,并尝试去修改和调用
	
	
package com.memorycat.aoptest.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
	public static void main(String[] args) throws Throwable {
		Class<Reflect1> clazz = Reflect1.class;
		Reflect1 reflect1 = (Reflect1) clazz.newInstance();// 调用默认构造方法
		System.out.println("***********现在获取类属性***********");
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);// 设置为可以访问<-private
			// 为id设置为9<-private
			if ((field.getType().getCanonicalName().equals("int") || field
					.getType().getCanonicalName().equals("java.lang.Integer"))
					&& field.getName().equals("id")) {
				field.setInt(reflect1, 9);
			}
			System.out.println("-----------------------");
			System.out.println("属性名" + field.getName());
			System.out.println("属性类型" + field.getType());
			System.out.println("属性值" + field.get(reflect1));
			System.out.println(field.getType() + " " + field.getName() + " = "
					+ field.get(reflect1) + ";");
		}
		System.out.println("***********现在获取类方法***********");
		Method[] declaredMethods = clazz.getDeclaredMethods();
		for (Method method : declaredMethods) {
			method.setAccessible(true);// 设置可以访问权限 <-private
			Class[] parameterTypes = method.getParameterTypes();
			System.out.println(">>执行方法:" + method);
			if (parameterTypes.length == 0) {
				method.invoke(reflect1, null);
			} else {
				// 判断int add(int num1, int num2)
				if (method.getName().equals("add")
						&& parameterTypes.length == 2) {
					int result = (int) method.invoke(reflect1, new Object[] {
							2, 7 });
					System.out.println("2+7=" + result);
				} else {
					if (method.getName().equals("add")
							&& parameterTypes.length == 3) {
						System.out.println("这还有3个参数的add()");
					}
				}
			}
		}
	}
}
	
	
	
	
最后输出结果
	
正在执行方法:public Reflect1() <- 默认构造方法 ***********现在获取类属性*********** ----------------------- 属性名id 属性类型int 属性值9 int id = 9; ----------------------- 属性名myName 属性类型class java.lang.String 属性值null class java.lang.String myName = null; ***********现在获取类方法*********** >>执行方法:int com.memorycat.aoptest.reflect.Reflect1.add(int,int) 2+7=9 >>执行方法:int com.memorycat.aoptest.reflect.Reflect1.add(int,int,int) 这还有3个参数的add() >>执行方法:private void com.memorycat.aoptest.reflect.Reflect1.foo1() 正在执行方法:private void foo1() >>执行方法:public void com.memorycat.aoptest.reflect.Reflect1.foo2() 正在执行方法:public void foo2() >>执行方法:public void com.memorycat.aoptest.reflect.Reflect1.printAttr() 正在执行方法: printAttr() -> [id=9, myName=null]
	
	
