
反射技术运用
发布日期:2021-05-08 05:28:18
浏览次数:17
分类:原创文章
本文共 2303 字,大约阅读时间需要 7 分钟。
前言
昨天工作中遇到使用反射的场景,看别人用得多了,真正自己使用后总结一下。
场景
工作中通常有场景是根据某个类型来判断调用哪个方法,比如我们有个导出的功能,有很多类型报表需要导出,如果是某个业务类型的功能我们需要调用不同的service,代码大概会是这样:
if(type ==0 ){ serviceA.doA(param1); } if(type ==1){ serviceB.doB(param1,param2); } if(type ==2){ serviceC.doC(param1,param2,param3); }
当类型很多,并且是随着业务的改动会增加时,如果我们用反射,某些场景下 ,我们只需要提前记录下 ,类名,方法名,参数就能动态调用这些方法。
反射
java中的反射:
Class<?> clazz; //调用自己创建的函数, //反射得到类 包名+类名,我这边没有包名就直接是 "ReflectionTest" clazz = Class.forName("com.abc.A"); //直接java反射得到方法 Method method= clazz.getMethod("test",String.class,int.class); Object obj1 = method.invoke(clazz.newInstance(),"wei",23);
这里重点介绍spring中的工具类ReflectionUtils
可以做成一个工具供调用
@Componentpublic class SpringContextsUtil implements ApplicationContextAware { private ApplicationContext applicationContext; public Object getBean(String beanName) { return applicationContext.getBean(beanName); } public <T> T getBean(String beanName, Class<T> clazs) { return clazs.cast(getBean(beanName)); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; }}
使用时:
Method method = ReflectionUtils.findMethod(springContextsUtil.getBean(beanName).getClass(), methodName, String.class, String.class, Boolean.class,String.class); Object[] param1 = new Object[3]; param1[0]=params[0]; param1[1]=params[1]; param1[2]=true; ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param1);
这样只需要拿到,类名,方法名,参数就能够动态调用方法了。
这里有一点注意findMethod,中的参数有可能是运行时动态获取的,所以可以这样写:
Class[] paramTypesss = new Class[3]; paramTypesss[0] = String.class; paramTypesss[1] = Integer.class; paramTypesss[2] = String.class; //paramTypesss[x] = 遍历params if(param[i] instanceof Integer)-->Integer.class ;//根据业务运行时动态获取变量类型 Method method = ReflectionUtils.findMethod(springContextsUtil.getBean(beanName).getClass(), methodName,paramTypesss); Object[] param1 = new Object[3]; param1[0]=params[0]; param1[1]=params[1]; param1[2]=true; ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param1);
发表评论
最新留言
不错!
[***.144.177.141]2025年03月29日 05时51分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C++
2019-03-05
[CTFSHOW]PHP特性
2019-03-05
navigator对象
2019-03-05
程序员面试防坑宝典,带你手撸红黑树,一文轻松搞定
2019-03-05
关于EFI系统分区(ESP)你应该知道的3件事
2019-03-05
题目总结 web 51-100
2019-03-05
5.Mybatis复杂映射开发
2019-03-05
Servlet2.5的增删改查功能分析与实现------删除功能(四)
2019-03-05
环境配置 jdk_mysql_myeclipse8.6
2019-03-05
Session验证码的实现(2018-7-3)
2019-03-05
spring启动错误:Could not resolve placeholder
2019-03-05
日志写入xml上传ftp遇到的问题
2019-03-05
Eclipse中serverRuntime Environment中没有Tomcat选项
2019-03-05
下载任意版本vmware对应的vmware tools
2019-03-05
将 github 中他人的 仓库 导入 码云中,从而 加快下载速度的 方式
2019-03-05
Java 类加载的过程 加载、验证、准备、解析、初始化
2019-03-05
JavaWeb---实现JavaBean来接收参数、请求转发、域对象
2019-03-05
瀚高数据库中 java代码类型与bit对应(APP)
2019-03-05
选择性估算器绕过行安全策略漏洞
2019-03-05
admin 修改数据报错
2019-03-05