通过反射获取FeignClient并调⽤⽅法我的⽬的是解耦合,需要缓存的加⼊缓存,统⼀管理。
反射会遇到⼀个坑,先上代码后填坑。
原先:
⼀个业务类:A
⼀个外部feign接⼝:D
调⽤流程图:
现在:
三个类:ABC
⼀个外部feign接⼝:D
调⽤流程图:
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[]) ute((RedisCallback<byte[]>) connection -> (Bytes()));
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){
Name().equals(me)){
Object invoke =getValueObject(key, param, genericFastJsonRedisSerializer, method);
return(List<T>) invoke;
}
}
}catch(Exception e){
<(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);
connection.Bytes(), value);
return null;
});
return invoke;
}catch(IllegalAccessException e){
<(e.getMessage(), e);
}catch(IllegalArgumentException e){
<(e.getMessage(), e);
}catch(InvocationTargetException e){
<(e.getMessage(), e);
}catch(SerializationException e){
fastjson常用方法<(e.getMessage(), e);
}
return invoke;
}
C是Acl类
public VO get(List<String> List){
(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)