java反射方法时,方法里面的需要其他的bean怎么注入

咱家少爷 2014-08-07 04:29:51
大神们,我项目有个需求,就是把一些方法程序调用时拦截,然后把拦截到的方法,方法所在的类,及调用该方法的所需参数,存进缓存系统中,然后搞个定时任务,从缓存里面取出这些东西,用java反射调用,之前拦截的方法,框架用的是spring+ibatis
现在是已经反射到了拦截的方法,但是这个方法里面需要的其他的bean,spring没有注入,造成方法调用失败,好像反射就没有使用spring的自动注入一样,这个咋做呀?
...全文
1332 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_34335927 2018-08-30
  • 打赏
  • 举报
回复
getObjetSameMehodByInterfaceMehtod里面是干啥啊
liquanfeng186 2016-12-19
  • 打赏
  • 举报
回复
跪求PafaApplicationContext和getObjetSameMehodByInterfaceMehtod的源码,急需!谢谢了。
开水好 2016-02-18
  • 打赏
  • 举报
回复
首先感谢楼主给的方法: 楼主的方法是 从spring容器取到sping管理的bean对象,然后将bean作为参数传入到反射类的方法中。
langzi_zhang 2015-10-22
  • 打赏
  • 举报
回复
您好,能提供PafaApplicationContext和getObjetSameMehodByInterfaceMehtod的源代码么,我们这里正好也是这个问题。
咱家少爷 2014-08-14
  • 打赏
  • 举报
回复
/得到对象 
								Class c = Class.forName(className); 
								logger.tasklog("===========到这里了====1");
								Object[] methodPramas;
								Class[] parameterTypes =new Class[]{};
								if(null==params || "".equals(params))//执行的方法没有参数
								{
									logger.tasklog("===========到这里了====2");
									methodPramas = new Object[]{};
								}
								else
								{
									logger.tasklog("===========到这里了====3");
									String[] paramStr = params.split("#");
									logger.tasklog("===========参数paramStr="+paramStr);
									parameterTypes = new Class[paramStr.length];
									methodPramas = new Object[paramStr.length];
									
									for(int i=0;i<paramStr.length;i++)
									{
										String[] str = paramStr[i].split("\\|");
										String type = str[0];
										String param = str[1];
										logger.tasklog("===========参数param"+param);
										logger.tasklog("===========参数type"+type);
										if(type.equals("String"))
										{
											methodPramas[i]=param;
											parameterTypes[i] = String.class;
											logger.tasklog("@@@@@@@@@@methodPramas"+methodPramas);
											logger.tasklog("@@@@@@@@@@parameterTypes"+parameterTypes);
										}
										else if(type.equals("Integer"))
										{
											methodPramas[i]=Integer.parseInt(param);
											parameterTypes[i] = int.class;
										}
										else if(type.equals("Date"))
										{
											Date date = DateUtil.formatStringToDate(param, "yyyy-MM-dd HH:mm:ss");
											methodPramas[i]=date;
											parameterTypes[i] = Date.class;
										}
										else if(type.equals("Long"))
										{
											methodPramas[i]=Long.parseLong(param);
											parameterTypes[i] = Long.class;
										}
										logger.tasklog("===========参数methodPramas"+methodPramas);
										logger.tasklog("===========参数parameterTypes"+parameterTypes);
									}
									logger.tasklog("===========过这里了methodPramas"+methodPramas);
								}
								logger.tasklog("#################参数parameterTypes"+parameterTypes);
								//获取到方法对象,假设方法的参数是一个int,method名为setAge 
								Method interfaceMethod = c.getMethod(methodName, parameterTypes);
								//执行方法 
								logger.tasklog("#################方法sAge"+interfaceMethod);
								logger.tasklog("#################开始反射调用方法)))))))");
//									sAge.invoke(inter, methodPramas); 
								PafaApplicationContext context = (PafaApplicationContext) AppContext.getInstance().getApplicationContext();
								BeanFactory factory = (BeanFactory) context; 
// 									Object obj = factory.getBean("orderService");  
								Object obj = factory.getBean(interfaceName);  
								Method method = getObjetSameMehodByInterfaceMehtod(obj, interfaceMethod);
								Object resultObj = method.invoke(obj, methodPramas);
咱家少爷 2014-08-14
  • 打赏
  • 举报
回复
嘿嘿,我也遇到这个问题了,刚开始也很郁闷呢,最好找了我们的架构师,解决了,比如method.invoke(AutoDealUtil , objects); 里面的method必须是接口的实现类的方法,不是接口的方法,而且AutoDealUtil 必须是从spring容器里面拿个,千万不能new.你new就相当于和spring没有任何关系了
咱家少爷 2014-08-13
  • 打赏
  • 举报
回复
只有这样做啦,谢谢哦
gaofuqi 2014-08-07
  • 打赏
  • 举报
回复
引用 10 楼 hu_yongxing 的回复:
引用 9 楼 gaofuqi 的回复:
[quote=引用 7 楼 hu_yongxing 的回复:] [quote=引用 6 楼 gaofuqi 的回复:] [quote=引用 5 楼 hu_yongxing 的回复:] [quote=引用 4 楼 gaofuqi 的回复:] [quote=引用 3 楼 hu_yongxing 的回复:] [quote=引用 2 楼 gaofuqi 的回复:] 如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?[/quote]额,但是我不知道方法里面需要哪个bean呀,我反射的方法我都不知道是哪个,更别说是方法里面需要的bean了,这个和我的问题一样http://bbs.csdn.net/topics/380173767但是没有结果[/quote] 你对应的反射类不能存放将调用的bean的name吗?然后在反射对象的方法通过bean name获取bean。[/quote]我调用方法时,是不能改变方法的内部结构的,你这样已经修改了原方法[/quote] 那你方法内部又是怎么调用的bean的? 通过方法参数传进去的?[/quote] 比如我要调用下面这个方法。但是方法里面需要这个bean(红色),但是这个bean没有注入,代码采用的是注解注入 @Override @Transactional(rollbackFor=Exception.class) public List<OrderDTO> initOrder(String aopsID, String orderType,String orderStatus) throws BusinessServiceException { try { List<OrderDTO> orderList=orderDao.searchOrder(aopsID,orderType,orderStatus); log.trace("未过滤订单列表:orderList="+orderList); List<OrderDTO> orderList2 =new ArrayList<OrderDTO>();[/quote] 那orderDao总要初始化吧,就在初始化处添加代码,或者如果有set方法,先获取bean,然后调用set方法注入到orderDao设置一下。
咱家少爷 2014-08-07
  • 打赏
  • 举报
回复
引用 9 楼 gaofuqi 的回复:
引用 7 楼 hu_yongxing 的回复:
[quote=引用 6 楼 gaofuqi 的回复:] [quote=引用 5 楼 hu_yongxing 的回复:] [quote=引用 4 楼 gaofuqi 的回复:] [quote=引用 3 楼 hu_yongxing 的回复:] [quote=引用 2 楼 gaofuqi 的回复:] 如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?[/quote]额,但是我不知道方法里面需要哪个bean呀,我反射的方法我都不知道是哪个,更别说是方法里面需要的bean了,这个和我的问题一样http://bbs.csdn.net/topics/380173767但是没有结果[/quote] 你对应的反射类不能存放将调用的bean的name吗?然后在反射对象的方法通过bean name获取bean。[/quote]我调用方法时,是不能改变方法的内部结构的,你这样已经修改了原方法[/quote] 那你方法内部又是怎么调用的bean的? 通过方法参数传进去的?[/quote] 比如我要调用下面这个方法。但是方法里面需要这个bean(红色),但是这个bean没有注入,代码采用的是注解注入 @Override @Transactional(rollbackFor=Exception.class) public List<OrderDTO> initOrder(String aopsID, String orderType,String orderStatus) throws BusinessServiceException { try { List<OrderDTO> orderList=orderDao.searchOrder(aopsID,orderType,orderStatus); log.trace("未过滤订单列表:orderList="+orderList); List<OrderDTO> orderList2 =new ArrayList<OrderDTO>();
gaofuqi 2014-08-07
  • 打赏
  • 举报
回复
引用 7 楼 hu_yongxing 的回复:
引用 6 楼 gaofuqi 的回复:
[quote=引用 5 楼 hu_yongxing 的回复:] [quote=引用 4 楼 gaofuqi 的回复:] [quote=引用 3 楼 hu_yongxing 的回复:] [quote=引用 2 楼 gaofuqi 的回复:] 如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?[/quote]额,但是我不知道方法里面需要哪个bean呀,我反射的方法我都不知道是哪个,更别说是方法里面需要的bean了,这个和我的问题一样http://bbs.csdn.net/topics/380173767但是没有结果[/quote] 你对应的反射类不能存放将调用的bean的name吗?然后在反射对象的方法通过bean name获取bean。[/quote]我调用方法时,是不能改变方法的内部结构的,你这样已经修改了原方法[/quote] 那你方法内部又是怎么调用的bean的? 通过方法参数传进去的?
gaofuqi 2014-08-07
  • 打赏
  • 举报
回复
引用 7 楼 hu_yongxing 的回复:
引用 6 楼 gaofuqi 的回复:
[quote=引用 5 楼 hu_yongxing 的回复:] [quote=引用 4 楼 gaofuqi 的回复:] [quote=引用 3 楼 hu_yongxing 的回复:] [quote=引用 2 楼 gaofuqi 的回复:] 如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?[/quote]额,但是我不知道方法里面需要哪个bean呀,我反射的方法我都不知道是哪个,更别说是方法里面需要的bean了,这个和我的问题一样http://bbs.csdn.net/topics/380173767但是没有结果[/quote] 你对应的反射类不能存放将调用的bean的name吗?然后在反射对象的方法通过bean name获取bean。[/quote]我调用方法时,是不能改变方法的内部结构的,你这样已经修改了原方法[/quote] 那你方法内部又是怎么调用的bean的?
咱家少爷 2014-08-07
  • 打赏
  • 举报
回复
引用 6 楼 gaofuqi 的回复:
引用 5 楼 hu_yongxing 的回复:
[quote=引用 4 楼 gaofuqi 的回复:] [quote=引用 3 楼 hu_yongxing 的回复:] [quote=引用 2 楼 gaofuqi 的回复:] 如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?[/quote]额,但是我不知道方法里面需要哪个bean呀,我反射的方法我都不知道是哪个,更别说是方法里面需要的bean了,这个和我的问题一样http://bbs.csdn.net/topics/380173767但是没有结果[/quote] 你对应的反射类不能存放将调用的bean的name吗?然后在反射对象的方法通过bean name获取bean。[/quote]我调用方法时,是不能改变方法的内部结构的,你这样已经修改了原方法
gaofuqi 2014-08-07
  • 打赏
  • 举报
回复
引用 5 楼 hu_yongxing 的回复:
引用 4 楼 gaofuqi 的回复:
[quote=引用 3 楼 hu_yongxing 的回复:] [quote=引用 2 楼 gaofuqi 的回复:] 如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?[/quote]额,但是我不知道方法里面需要哪个bean呀,我反射的方法我都不知道是哪个,更别说是方法里面需要的bean了,这个和我的问题一样http://bbs.csdn.net/topics/380173767但是没有结果[/quote] 你对应的反射类不能存放将调用的bean的name吗?然后在反射对象的方法通过bean name获取bean。
咱家少爷 2014-08-07
  • 打赏
  • 举报
回复
引用 4 楼 gaofuqi 的回复:
引用 3 楼 hu_yongxing 的回复:
[quote=引用 2 楼 gaofuqi 的回复:] 如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?[/quote]额,但是我不知道方法里面需要哪个bean呀,我反射的方法我都不知道是哪个,更别说是方法里面需要的bean了,这个和我的问题一样http://bbs.csdn.net/topics/380173767但是没有结果
gaofuqi 2014-08-07
  • 打赏
  • 举报
回复
引用 3 楼 hu_yongxing 的回复:
引用 2 楼 gaofuqi 的回复:
如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
那不是同一个意思吗?
咱家少爷 2014-08-07
  • 打赏
  • 举报
回复
引用 2 楼 gaofuqi 的回复:
如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
不是的,不是为了获取bean,而是调用方法的时候需要这个bean
gaofuqi 2014-08-07
  • 打赏
  • 举报
回复
如果只是想获取spring bean的话,实现ApplicationContextAware接口,在spring配置即可。
咱家少爷 2014-08-07
  • 打赏
  • 举报
回复
自己顶顶,别沉了

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧