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

  1. 深入解析Java反射-invoke方法

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...

  2. 深入解析Java反射(1) - 基础

    深入解析Java反射(1) - 基础 最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回 ...

  3. 深入解析Java反射基础

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...

  4. 深入解析Java反射

    因为本人最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回顾:什么是反射? 反射(Ref ...

  5. 基础篇:深入解析JAVA反射机制

    目录 反射的概念 获取Class的三种方法 JAVA反射API 反射机制应用的场景 反射和JDK动态代理 欢迎指正文中错误 关注公众号,一起交流 参考文章 反射的概念 java的放射机制:在程序运行时 ...

  6. 通过Java反射调用方法

    这是个测试用的例子,通过反射调用对象的方法.     TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...

  7. javaproject积累——java 反射 invoke

    铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...

  8. JAVA反射调用方法

    1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotation.SetTable ...

  9. 反射invoke()方法

    invoke()方法: 主要是为了类反射,可以在不知道具体类的情况下,根据配置字符串去调用一个类的方法.最简单的方法是可以把方法参数化.    main.invoke():     比如Test类里有 ...

随机推荐

  1. pycharm 设置 默认信息

    在pycharm使用过程中,对于每次新建文件的shebang行和关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择File-Settings, 2 ...

  2. Struts11---文件上传

    01.创建对应的上传页面 <body> <form action="user/upload" method="post" enctype=&q ...

  3. LeetCode OJ:Palindrome Linked List(回文链表判断)

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  4. input text 不显示输入的历史记录

    当之前的text框输入了数据后,下次输入有历史记录问题的解决方法 怎么禁止输入框记录输入记录,双击input出现输入过的记录, 有过表单设计经验的朋友肯定知道,当我们在浏览器中输入表单信息的时候,往往 ...

  5. AutoLayout 使用详细

    1.实际应用中,这Compact,Any,Regular如何运用呢? w:Any h:Any 是我们刚建立工程时候默认选择的,算是一切描述的父类.其他的种类描述都是在此基础上变化的,比如:如果weig ...

  6. Flask 的 数据库连接 与 DBUtils 数据库连接池

    Flask 的 数据库连接 与 DBUtils 数据库连接池 本地线程:thread_local 为每个线程创建存储数据的空间,用于线程之间的数据隔离 否则多个线程同时访问,会使得数据混乱 1 Fla ...

  7. 数据库基础 非关系型数据库 MongoDB 和 redis

    数据库基础 非关系型数据库 MongoDB 和 redis 1 NoSQL简介 访问量增加,频繁的读写 直接访问(硬盘)物理级别的数据,会很慢 ,关系型数据库的压力会很大 所以,需要内存级的读写操作, ...

  8. initWithImage和imageWithContentsOfFile的区别

    UIImageView *imageView = [[UIImageView alloc] initWithImage:         [UIImage imageNamed:@"icon ...

  9. Redis设计与实现 (一): 简单动态字符串

    1.定义 Redis没有使用C语言的字符串,  C语言的字符串只会用在不需要对字符串修改而只使用其值地方. Redis使用SDS表示字符串, 结构定义 : typedef char *sds; str ...

  10. 5,基于关系和超链接的 API

    Tutorial 5: Relationships & Hyperlinked APIs At the moment relationships within our API are repr ...