通过反射获取FeignClient并调用方法

我的目的是解耦合,需要缓存的加入缓存,统一管理。

反射会遇到一个坑,先上代码后填坑。

原先:

一个业务类:A
一个外部feign接口:D

调用流程图:

A业务类
D是feign接口

现在:

三个类:ABC
一个外部feign接口:D

调用流程图:

A业务类
B反射工具类
C是Acl类
D是feign接口

A业务类

    public List<DTO> getInfo(Vo Vo) {

        List<DTO> get = B.getFromRedisList(
                RedisKeyConstant.Utils_get + Vo.toString(), "get", Vo, DTO.class);
        return get;
    }

B反射工具类

  public static <T> List<T> getFromRedisList(String key, String me, Object param, Class<T> targetClass) {

        GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
        if (redisTemplate.hasKey(key)) {
            byte[] info = (byte[]) redisTemplate.execute((RedisCallback<byte[]>) connection -> connection.get(key.getBytes()));
            if (info == null) {
                return new ArrayList<>();
            }
            String deserialize = genericFastJsonRedisSerializer.deserialize(info).toString();
            List<T> ts = JSON.parseArray(deserialize, targetClass);
            return ts;
        } else {
            try {
                Class<C> C = C.class;
                Method[] methods = C.getMethods();
                for (Method method : methods) {
                    if (method.getName().equals(me)) {
                        Object invoke = getValueObject(key, param, genericFastJsonRedisSerializer, method);
                        return (List<T>) invoke;
                    }
                }
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        }
        return new ArrayList<>();
    }


    private static Object getValueObject(String key, Object param, GenericFastJsonRedisSerializer genericFastJsonRedisSerializer, Method method1) {

        Object invoke = new Object();
        try {
            invoke = method1.invoke(C, param);
            final byte[] value = genericFastJsonRedisSerializer.serialize(invoke);
            redisTemplate.execute((RedisCallback<Void>) connection -> {
                connection.set(key.getBytes(), value);
                connection.expire(key.getBytes(), PlanRedisKeyConstant.time_s);
                return null;
            });
            return invoke;
        } catch (IllegalAccessException e) {
            log.error(e.getMessage(), e);
        } catch (IllegalArgumentException e) {
            log.error(e.getMessage(), e);
        } catch (InvocationTargetException e) {
            log.error(e.getMessage(), e);
        } catch (SerializationException e) {
            log.error(e.getMessage(), e);
        }
        return invoke;
    }

C是Acl类

    public VO get(List<String> List) {

        return D.get(List);
    }

D外部接口feign

   @PostMapping({"get"})
    List<DTO> get(@RequestBody Vo Vo);

注意点:

反射出来的类,里面通过@Autowired注入的类全部是空,如果直接使用

method.invoke(反射出来的类, param)

会报错。
应该改为:
先把需要反射的类注入进来,然后调用反射的方法时把注入进来的类写进去。

private static C C;

    @Autowired
    private C CTemp;
       @PostConstruct
    private void init() {
        C = CTemp;
    }

method1.invoke(C, param)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值