在spring框架下使用反射的时候,我们需要注意一点,也是我最近遇到的一个问题,那就是如果反射的那个类中有注入bean实例的话,使用普通方式的反射会有问题。
定义一个类
@Service("example")
@Transactional(rollbackFor = Exception.class)
public class Example {
@Resource
XxxService xxxService;
public void method (String id) {
xxxService.xxxMethod(id);
}
}
public class ReflectExample {
@Resource
private ApplicationContext applicationContext;
public void reflectMethod (String id) {
// 反射获取Example
Class<?> clazz;
try {
clazz = Class.forName("com.example.Example");
Method method = clazz.getDeclaredMethod("method", String.class);
// 由于Example 中注入了其他的bean实例,无法通过newInstance()方法获取。
// 所以在这里使用的是ApplicationContext来获取注入到容器中的bean实例。
Object o = applicationContext.getBean("example");
// 调用方法
// Object obj = method.invoke(clazz.newInstance(),id);
method.invoke(o, id);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
我这里使用的是注入ApplicationContext实例来获取Example 的实例,这样就能调用Example 的method方法,不然会报错。
还有其他方式获取注入到容器中的bean,有兴趣的可以自行百度。