一、反射获取类对象的三种方式
方式一:通过类名或接口名直接获取
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);
}
}