有的時候為了程序的靈活性,需要根據參數動態的調用方法。代碼框架大致spring為主,下面是具體代碼:
接口:
實現類(實現類中有一個從spring容器中取的對象)
這是最初我直接用反射去調用的代碼:
Object obj = Class.forName("com.rw.article.service.pay.impl.WithdrawalsServiceProxyImpl").newInstance(); log.info("obj [ {} ] " ,obj); obj.getClass().getDeclaredMethod("test",String.class).invoke(obj,"zs1");
打印結果如下:
可以看到直接用反射需要從spring容器獲取的那個對象是不能被注入的,那么只能換一種方式。
可以拿到值的方式:
Class c2 = Class.forName("com.rw.article.service.pay.IWithdrawalsProxyService"); Object obj = BeansUtils.getBean("withdrawalsServiceProxyImpl",c2 ); // Object obj = Class.forName("com.rw.article.service.pay.impl.WithdrawalsServiceProxyImpl").newInstance(); log.info("obj [ {} ] " ,obj); obj.getClass().getDeclaredMethod("test",String.class).invoke(obj,"zs1");
再看看BeansUtils.java的代碼:
@Component public class BeansUtils implements ApplicationContextAware { private static ApplicationContext context; public static <T> T getBean(Class<T> bean) { return context.getBean(bean); } public static <T> T getBean(String var1, @Nullable Class<T> var2){ return context.getBean(var1, var2); } public static ApplicationContext getContext() { return context; } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { BeansUtils.context = context; } }
BeansUtils實現了ApplicationContextAware 接口,在spring容器初始化完成后,這個類就可以方便地獲得 ApplicationContext 中的所有bean。換句話說,就是這個類可以直接獲取Spring配置文件中,所有有引用到的bean對象。這個只要把class(Class c2 = Class.forName(“com.rw.article.service.pay.IWithdrawalsProxyService”);)傳過來也可以實現動態調用某個類里面的方法
然后看這次的測試結果:
測試結果是能夠使用注解從spring容器中拿到對象的,要先從spring容器中拿到的對象,spring的那套注解才生效