当前位置:   article > 正文

解决被反射的类无法被spring管理,空指针异常问题

解决被反射的类无法被spring管理,空指针异常问题

目录

问题

原因

解决方案


问题

这是我在开发语音指令识别功能时遇到的问题,在将语音转成文字后需要进行指令匹配,指令匹配成功,就会获得对应的处理方法名称以及所属类,然后通过反射机制去执行该方法完成指令对应的操作

部分代码如下:

  1. @Component
  2. public class MethodSet {
  3. private final Map<String, Class<?>> methodMap = new HashMap<>();
  4. public Map<String, Class<?>> getMethodMap() {
  5. methodMap.put("countOrder", OrderCommand.class);
  6. methodMap.put("takeOrder",OrderCommand.class);
  7. //。。。。其他命令与对应的类
  8. return methodMap;
  9. }
  10. }
  1. log.info("method key:{}",reply);
  2. Class<?> aClass = methodSet.getMethodMap().get(reply);
  3. Method method = aClass.getMethod(reply);
  4. Object result = method.invoke(aClass.getDeclaredConstructor().newInstance());
  5. reply = (String) result;

在获取到需要通过反射执行的方法,以及方法所属类之后就能进行调用指令方法了,但是我的指令类内部依赖了相关Service类(被spring容器管理)代码如下:

  1. @Component
  2. public class OrderCommand{
  3. @Autowired
  4. private StoreOrderService storeOrderService;
  5. public String countOrder(){
  6. System.out.println("订单统计方法执行");
  7. Map<String, Integer> orderNumbers = storeOrderService.getOrderNumbers();
  8. //其他逻辑。。。。。
  9. };
  10. //。。。。。。。
  11. }

此时就抛出了空指针异常,提示我storeOrderService.getOrderNumbers()方法并不存在,也就是依赖并没有注入成功。

原因

在我搜寻资料后也是找到了原因,就是被反射的类无法被spring管理

参考博客文章:@Autowired被反射调用时,空指针错误_mock@autowired对象空指针-CSDN博客

解决方案

手动去完成@Autowired效果,交给spring容器管理。

步骤:

通过spring上下文ApplicationContext的getBean(Class<T>)方法按照类型获取bean实例

通过ApplicationContext的getAutowireCapableBeanFactory()方法获取到AutowireCapableBeanFactory对象使用它的autowireBean(obj)方法来手动处理Bean的自动装配

修改后反射调用代码如下:

  1. Class<?> aClass = methodSet.getMethodMap().get(reply);
  2. Object obj = applicationContext.getBean(aClass);
  3. applicationContext.getAutowireCapableBeanFactory().autowireBean(obj);
  4. Method method = obj.getClass().getMethod(reply);
  5. Object result = method.invoke(obj);
  6. reply = (String) result;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/334758
推荐阅读
相关标签
  

闽ICP备14008679号