spring使用反射的注意事项

在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,有兴趣的可以自行百度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值