解析Java反射 - invoke方法

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

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

猜你喜欢

转载自www.cnblogs.com/lidelin/p/9294302.html
今日推荐