如何扫描项目中所有 FeignClient 的注解属性信息

2020-10-28 11:59:20 +08:00
 sunzy

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/719372

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX