最近遇到了如何让函数动态排序后执行的问题,所以在此记录java中如何使用反射对某个类中的多个方法进行动态排序执行。
通过反射获取类的实例对象的方式有三种:
(1)MethodPriority methodPriority = new MethodPriority();
Class stuClass = methodPriority.getClass();
(2)Class stuClass2 = MethodPriority.class;
(3)Class stuClass3 = Class.forName(“wmq.fly.methodpriority.MethodPriority”);//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
本次使用的是第一种方式获取实例对象。
- car.java
public class Car {
private String name;
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "Car [name=" + name + ", type=" + type + "]";
}
}
- MethodPriority.java 中定义了 runAliPay、runWechatPay和runBalancePay三个函数,main函数中对这三个函数进行了动态排序,并执行。
public class MethodPriority {
public String runAliPay(Car car, String str) {
System.out.println(car.toString() + "runAliPay");
car.setName("奥迪");
System.out.println(car.toString() + "runAliPay");
return str+"runAliPay";
}
public String runWechatPay(Car car, String str) {
System.out.println(car.toString() + "runWechatPay");
car.setName("红旗");
System.out.println(car.toString() + "runWechatPay");
return str+"runWechatPay";
}
public String runBalancePay(Car car, String str) {
System.out.println(car.toString() + "runBalancePay");
car.setName("宝马");
System.out.println(car.toString() + "runWechatPay");
return str+"runAliPay";
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//传入的参数
Car car = new Car();
car.setName("大奔");
car.setType("小型车");
//实例化将要调用方法的所在类
MethodPriority methodPriority = new MethodPriority();
//方法名
String[] methodName = {"runAliPay", "runWechatPay", "runBalancePay"};
//对方法名排序
Integer[] methodPriorityArr = {2,0,1};
//利用反射按方法排序调用对应的方法
for(Integer i : methodPriorityArr) {
Method method = methodPriority.getClass().getMethod(methodName[i], Car.class, String.class);
Object invoke = method.invoke(methodPriority, car, i.toString());
System.out.println(invoke);
}
}
}
- 执行结果如下:
Car [name=大奔, type=小型车]runBalancePay
Car [name=宝马, type=小型车]runWechatPay
2runAliPay
Car [name=宝马, type=小型车]runAliPay
Car [name=奥迪, type=小型车]runAliPay
0runAliPay
Car [name=奥迪, type=小型车]runWechatPay
Car [name=红旗, type=小型车]runWechatPay
1runWechatPay