解析Java反射 - invoke方法

java

       最近工作中涉及到获取同程火车票,大概描述为:将本地获取的发出城市,目的城市及出发时间按固定格式封装,调用接口获取可乘坐座席等级最高的火车票,接口返回数据用包含三层类封装的类接受,接受的类总共为四层,倒数第二层为多个类型相同(座席类)的属性类,给最后一层类赋值是通过属性名反射的,也就是说类变量名不同,变量类型相同,最后只有部分变量名有值,其他都为空。在获取具体某个座席时会用到Java反射,笔者觉得应该记录下。

首先,在反射之前得获取到具体方法。Java中:getMethods()是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的);getDeclaredMethods()是获取本类中的所有方法,包括私有的(private、protected、默认以及public)的方法。在这里笔者采用getMethods(),原因是倒数第二层类获取属性方法都为public。

其次,获取到方法后需要执行该方法才可以获取到返回的数据,所以用到 invoke方法,因为反射的方法没有传参数,所以至需要在里边传入类就行。

最后,将代码附上:

/**

* 判断trains中是否含有trainClass这个类型的车次,如果有,取出seatClass这个座位类型的票价

* @param trains

* @param trainClass

* @param seatClass

* @return

* @throws InvocationTargetException

* @throws IllegalAccessException

* @throws IllegalArgumentException

*/

private SeatItemDomain contain(List<TrainInfoDomain> trains,String trainClass,String seatClass) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{

if(null == trains || trains.size() == 0 || StringUtil.isEmpty(trainClass)){

return null;

}
//最后一层类

SeatItemDomain seatItemDomain = null;
//存放倒数第二层所有公共方法的方法

Method[] m = null;
//倒数第二层类

TrainInfoDomain domain = null;

for (int i = 0; i < trains.size(); i++) {

domain = trains.get(i);

if(trainClass.equals(domain.getTrainClass())){
//获取所有公共方法

m = domain.getTickets().getClass().getMethods();

for(int j = 0;j < m.length;j++){
//循环遍历,判断方法是否为所需要的方法

if(("get"+seatClass).toLowerCase().equals(m[j].getName().toLowerCase())){
//反射,获取最后一层类的数据

seatItemDomain = (SeatItemDomain) m[j].invoke(domain.getTickets());

return seatItemDomain;

}

}

}

}

return null;

}

由于总结时间匆忙,难免出现错误,朋友们如有发现问题或疑问,希望留言。

以上是 解析Java反射 - invoke方法 的全部内容, 来源链接: utcz.com/z/394388.html

回到顶部