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