@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);
}
}
}
1
madworks 2020-10-28 12:22:11 +08:00
你这样试一下,entry.getValue().getClass().getAnnotation(FeignClient.class)
|
3
leejoker 2020-10-28 14:33:28 +08:00
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)); } }); |
4
leejoker 2020-10-28 14:40:17 +08:00
大概是这样,spring 里的 bean 是通过代理的方式注册的,需要用代理的方式去获取。
代码是从我写的工具里截取的: https://github.com/leejoker/feign-dev-tool-starter |
6
DreamSpace 2020-10-28 15:16:57 +08:00
@leejoker 老哥发的链接好像是个 private repository,看不到具体的代码实现
|
7
leejoker 2020-10-28 15:21:39 +08:00
是的 XD,已经改了
|
8
leejoker 2020-10-28 15:24:15 +08:00
|