如何扫描项目中所有 FeignClient 的注解属性信息
@FeignClient 不是有一些如 name 、url 等的属性信息么 通过applicationContext.getBeansWithAnnotation(FeignClient.class)
可以拿到 @FeignClient 的所有 bean 但是由于 @FeignClient 都是 interface,通过getAnnotations()
拿不到注解的属性信息, 代码如下,求大神指点一下
Map<String,Object> beans = applicationContext.getBeansWithAnnotation(FeignClient.class);
if (beans.size() > 0){
for (Map.Entry<String, Object> entry : beans.entrySet()){
String beanName = entry.getKey();
Annotation[] annotations = entry.getValue().getClass().getAnnotations(); //空的
AnnotatedType[] annotatedTypes = entry.getValue().getClass().getAnnotatedInterfaces();
for(AnnotatedType annotationType : annotatedTypes){
Type type = annotationType.getType();
Annotation[] typeAnnotations = type.getClass().getAnnotations(); //空的
Annotation[] annotationTypeAnnotations = annotationType.getAnnotations(); //空的
Annotation[] declaredAnnotations = annotationType.getDeclaredAnnotations(); //空的
System.out.println(annotationTypeAnnotations);
System.out.println(declaredAnnotations);
}
}
}
----------------------- 以下是精选回复-----------------------
答:你这样试一下,entry.getValue().getClass().getAnnotation(FeignClient.class)
答:beans.forEach((k, v) -> {
try {
if (Proxy.isProxyClass(v.getClass())) {
InvocationHandler ih = Proxy.getInvocationHandler(v);
Field targetField = ih.getClass().getDeclaredField("target");
targetField.setAccessible(true);
Target target = (Target) targetField.get(ih);
Field nameField = target.getClass().getDeclaredField("name");
nameField.setAccessible(true);
String clientName = (String) nameField.get(target);
Field urlField = target.getClass().getDeclaredField("url");
urlField.setAccessible(true);
String url = (String) urlField.get(target);
System.out.println("clientName: " + clientName);
System.out.println("url: " + url);
}
} catch (Exception e) {
log.error("失败,exception={}", ExceptionUtils.getStackTrace(e));
}
});
答:大概是这样,spring 里的 bean 是通过代理的方式注册的,需要用代理的方式去获取。
代码是从我写的工具里截取的: https://github.com/leejoker/feign-dev-tool-starter
答:是的 XD,已经改了
0条评论