问题描述:

当通过反射获取任务所在类的方法时,方法中通过依赖注入进来的对象全部为空导致异常报错。

 

String repXml = "";
                    RepTransaction transaction = S_UtilsXml.getRepTransaction((String) msg);
                    Class controller = Class.forName("com.yu.netty_esb.ServerController.GetStudentInfoController");
                    //创建对象
                    Object object = controller.newInstance();

                    Method method = controller.getMethod("GetStudentInfo",Object.class,RepTransaction.class);

 

原因分析:

通过class.newInstance() 获取类的方式没有与Spring容器关联起来获取bean,虽然也能拿到类的实例,但是如果类里面有@Autowired这种方式注入的对象时就会为空,无法获取到对象。

思路:因为反射获取的对象不被Spring所管理,所以可以从Spring中获取对象实例。

首先引入:

 

@Autowired
    private ApplicationContext applicationContext;

 

在反射类中使用

Class<?> clazz = Class.forName(classname);
//获取bean, 这个就是已经注入好的javaBean
Object bean = applicationContext.getBean(clazz);
applicationContext.getAutowireCapableBeanFactory().autowireBean(bean);