解析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;
- }
- 由于总结时间匆忙,难免出现错误,朋友们如有发现问题或疑问,希望留言。
解析Java反射 - invoke方法的更多相关文章
- 深入解析Java反射-invoke方法
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...
- 深入解析Java反射(1) - 基础
深入解析Java反射(1) - 基础 最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回 ...
- 深入解析Java反射基础
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...
- 深入解析Java反射
因为本人最近正筹备Samsara框架的开发,而其中的IOC部分非常依靠反射,因此趁这个机会来总结一下关于Java反射的一些知识.本篇为基本篇,基于JDK 1.8. 一.回顾:什么是反射? 反射(Ref ...
- 基础篇:深入解析JAVA反射机制
目录 反射的概念 获取Class的三种方法 JAVA反射API 反射机制应用的场景 反射和JDK动态代理 欢迎指正文中错误 关注公众号,一起交流 参考文章 反射的概念 java的放射机制:在程序运行时 ...
- 通过Java反射调用方法
这是个测试用的例子,通过反射调用对象的方法. TestRef.java import java.lang.reflect.Method; import java.lang.reflect.In ...
- javaproject积累——java 反射 invoke
铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...
- JAVA反射调用方法
1.用户类 package com.lf.entity; import com.lf.annotation.SetProperty; import com.lf.annotation.SetTable ...
- 反射invoke()方法
invoke()方法: 主要是为了类反射,可以在不知道具体类的情况下,根据配置字符串去调用一个类的方法.最简单的方法是可以把方法参数化. main.invoke(): 比如Test类里有 ...
随机推荐
- react table dropdown
<DropdownButton type="primary" trigger={['click']} onClick={() => this.detail(item)} ...
- 原创:项目管理的理论与实践 讲座的PPT
业余时间做的两个PPT,曾经给公司同事讲过,PPT内容毕竟还是不够全面,如果有不清楚的地方,欢迎提问 项目管理的理论与实践 虚拟案例-超市管理系统
- 利用Python进行文章特征提取(一)
# 文字特征提取 词库模型(bag of words) 2016年2月26,星期五 # 1.词库表示法 In [9]: # sklearn 的 CountVectorizer类能够把文档词块化(tok ...
- Python 字符串相似性的几种度量方法
字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是:把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这种 ...
- TCP, Scoket, HTTP(转)
1.TCP连接 要想明白Socket连接,先要明白TCP连接.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上 ...
- RabbitMQ学习系列三-C#代码接收处理消息
RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...
- NNI (Neurol Network Intelligence) 是微软开源的自动机器学习工具
NNI (Neurol Network Intelligence) 是微软开源的自动机器学习工具 https://www.cnblogs.com/ms-uap/p/9719071.html [重磅]微 ...
- VC++ windows开机自启动设置
设置开机启动 很多软件要求软件能够在开机时自启动,下面讲讲如何设置开机自启动. Windows设置程序的开机启动的方法有很多,这里只讲其中的一种,该方法同时适用于32位和64位的操作系统,只需将需要开 ...
- springboot 自定义属性
前言 spring boot使用application.properties默认了很多配置.但需要自己添加一些配置的时候,我们如何添加呢 1.添加自定义属性 在src/main/resources/a ...
- 列表推导式,两个for循环的例子
[a for a in alist for b in blist if a>b] for i in alist,blist: print(i) >> alist[] >> ...