思路:通过自定义spring的bean工具类获取到spring上下文对象的ApplicationContext ,进而获取feign接口的代理对象和方法,最后通过反射执行方法。
参考文章:https://blog.csdn.net/admin_mvip/article/details/116003763
自定义的MySpringBeanUtil工具类
/**
* 通过@Component注解把工具类交给spring管理,MySpringBeanUtil 实现了ApplicationContextAware类
* 方便获取ApplicationContext对象,也就是spring上下文对象,
*进而在其它地方可以通过MySpringBeanUtil 工具类的applicationContext对象获取bean对象
*/
@Component
public class MySpringBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(MySpringBeanUtil.applicationContext == null) {
MySpringBeanUtil.applicationContext = applicationContext;
}
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
反射调用执行工具类代码:
public static void main(String[] args){
String feginClass = "com.mytest.feignClient.TestFeignClient";
String methodName = "test";
/*通过Class对象来获取对象中的方指定法
*第一个参数是class对象,第二个参数是方法名
*第三个参数是可变参数(根据需求可传可不传),需要传入参数的类型class对象(eg:String.class)
*/
Method method = Arrays.stream(MySpringBeanUtil.getBean(feginClass).getClass().getMethods()).filter(m->m.getName.equals(methodName)).collect(Collectors.toList()).get(0);
/*
*执行方法
*第一个参数是Method 对象,第二个参数是对象
*第三个参数是可变参数(根据需求可传可不传),需要传入调用方法的参数值
*/
Object resultObj = ReflectionUtils.invokeMethod(method,MySpringBeanUtil.getBean(feginClass),new Object[]{参数...});
}
feign客户端代码
@FeignClient("testService")
public interface TestFeignClient{
@GetMapping("/test")
String test();