一、反射获取类对象的三种方式

        方式一:通过类名或接口名直接获取

                      Class clazz = Messages.class

        方式二:通过类对象获取

                      Class clazz = m.getClass()

        方式三:通过完整类名或接口名获取

                      Class clazz = Class.forName("类或接口全路径")

        注意:不包含文件后缀名“.java”,如:获取Message.java类的反射对象,

                   Class clazz = Class.forName("reflect.test.Messages")

二、获取当前类属性的方法

        1.获取属性的方法

                   获取指定成员属性对象:Field field = clazz.getField("成员属性名");

                   获取成员属性值:Object obj = field.get("Object");

                   获取所有成员属性:Field[] fields = clazz.getFields();

        2.获取方法的方法

                   获取声明为public的成员方法:Method method =  clazz.getMethod("方法名",可变参数);

注意:其中可变参数表示:method所代表的方法中的参数列表的“.class”,例如:String.class、int.class、float.class等

                   获取所有成员方法:Method[] methods2 =  clazz.getDeclaredMethods();

三、执行方法解释

        method.invoke(Object, args)

        method:表示通过反射获取类中的方法

        invoke():表示调用该方法来执行method代表的方法

        Object:表示类对象,通过传入该类对象来执行该类中某个方法(即执行用method来代表该类中的方法)

        args:表示需要传入method所代表的方法中的参数列表

四、反射小案例

       小明和小王到商店买零食付款案例

        1.创建Person接口

package reflect.shopping;

public interface Person {
	
	//付款方法	
	int cell(String name);

}

        2.创建Xm、Xw类实现Person接口

package reflect.shopping;

public class Xm implements Person {

	@Override
	public int cell(String name) {
		int lt = 5;
		System.out.println(name+"购买一包卫龙辣条");
		return lt;
	}

}
package reflect.shopping;

public class Xw implements Person {

	@Override
	public int cell(String name) {
		int sp = 10;
		System.out.println(name+"购买一包乐事薯片");
		return sp;
	}

}

        3.创建ShoppingTest测试类,通过反射调用购物方法

package reflect.shopping;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ShoppingTest {

	public static void main(String[] args) throws SecurityException,
			NoSuchMethodException, IllegalArgumentException,
			IllegalAccessException, InvocationTargetException {
		// 获取Class对象
		Class<Person> clazz = Person.class;
		// 通过反射获取cell()方法,method表示获取到的cell()方法
		Method method = clazz.getMethod("cell", String.class);
		// 分别创建小明和小王的对象
		Xm xm = new Xm();
		Xw xw = new Xw();
		// 通过调用invoke()方法执行cell()
		int m = (Integer) method.invoke(xm, "小明");
		System.out.println("小明付款:" + m);
		int w = (Integer) method.invoke(xw, "小王");
		System.out.println("小王付款:" + w);

	}

}