通过反射调用feign接口的方法

思路:通过自定义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();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容