码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA在不确定具体 Annotation 类型时,获得注解参数

时间:2018-01-30 00:11:44      阅读:435      评论:0      收藏:0      [点我收藏+]

标签:access   comm   new   技术   methods   rest   lte   private   start   

  
package com.lzw.demo;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @RestController
    @RequestMapping(path = "/a")
    public static class A {
        @GetMapping(path = "/find")
        public void add() {
            System.out.println("find");
        }
        @DeleteMapping(path = "/delete")
        public void delete() {
            System.out.println("delete");
        }
    }

    @RestController
    @RequestMapping(path = "/b")
    public static class B {
        @PutMapping(path = "/update")
        public void update() {
            System.out.println("update");
        }
        @PostMapping(path = "/add")
        public void add() {
            System.out.println("add");
        }
    }

    /**
     * Created by laizhenwei on 2018-1-29 22:48:49.
     */
    @Component
    public static class appStartUp implements CommandLineRunner {

        @Autowired
        private RequestMappingHandlerMapping requestMappingHandlerMapping;

        @Override
        public void run(String... strings){
            Class<Annotation>[] annoClz =
                    new Class[]{RequestMapping.class, PostMapping.class,
                            GetMapping.class, DeleteMapping.class, PutMapping.class};
            Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
            List<Class<?>> beanTypes = map.keySet()
                    .stream().filter(info -> map.get(info)
                            .getBeanType().getAnnotation(RequestMapping.class) != null)
                    .collect(Collectors.toList())
                    .stream().map(i -> map.get(i).getBeanType())
                    .collect(Collectors.toList());
            beanTypes.forEach(t -> Arrays.stream(t.getMethods()).forEach(method ->
                    {
                        for (int i = 0; i < annoClz.length; i++) {
                            Annotation mappingAnno = method.getAnnotation(annoClz[i]);
                            if (mappingAnno != null) {
                                try {
                                    InvocationHandler invocationHandler = Proxy.getInvocationHandler(mappingAnno);
                                    Field value = invocationHandler.getClass().getDeclaredField("memberValues");
                                    value.setAccessible(true);
                                    Map<String, Object> memberValues = (Map<String, Object>) value.get(invocationHandler);
                                    System.out.println(Arrays.toString(((String[]) memberValues.get("path"))));
                                } catch (Exception ex) {
                                    ex.printStackTrace();
                                }
                            }
                        }
                    }
            ));
        }
    }
}

 

 

技术分享图片

 

JAVA在不确定具体 Annotation 类型时,获得注解参数

标签:access   comm   new   技术   methods   rest   lte   private   start   

原文地址:https://www.cnblogs.com/sweetchildomine/p/8379838.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!