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 类型时,获得注解参数的更多相关文章

  1. Java 中long类型转换成为int类型时可能会出错的地方

    那计算两个日期之间间隔的天数为例来说明这个问题. 下面是计算日期间隔天数的简单算法(主要出错的地方为红色标注的地方): public int getDay(String startDate, Stri ...

  2. Effective Java 第三版——62. 当有其他更合适的类型时就不用字符串

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  3. Java byte类型转换成int类型时需要 & 0XFF的原因

    Java byte类型转换成int类型时需要 & 0XFF的原因 假设有byte b  = -1; 那么b的二进制是:1111 1111. 如果将b直接转换为int类型,那么二进制是 1111 ...

  4. 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)

    1.我们都知道在struts2中为防止浏览器绕过struts过滤器直接请求页面,所以我们都会配置一个拦截所有页面的action,如下: <action name="*"> ...

  5. 深入理解Java的注解(Annotation):自定义注解入门(2)

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  6. 深入理解Java:注解(Annotation)自己定义注解入门

    深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的 ...

  7. oracle: jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111

    https://www.cnblogs.com/mmlw/p/5808072.html org.mybatis.spring.MyBatisSystemException: nested except ...

  8. java:警告:[unchecked] 对作为普通类型 java.util.HashMap 的成员的put(K,V) 的调用未经检查

    java:警告:[unchecked] 对作为普通类型 java.util.HashMap 的成员的put(K,V) 的调用未经检查 一.问题:学习HashMap时候,我做了这样一个程序: impor ...

  9. java.sql.Types,数据库字段类型,java数据类型的对应关系

    以下转自:http://kummy.itpub.net/post/17165/172850 本文在原文基础上有增减. 本概述是从<JDBCTM Database Access from Java ...

随机推荐

  1. 理解Object.defineProperty的作用

    对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = ...

  2. 支付sdk —— 该组件为封装了 微信,支付宝,银联支付

    [精品]  支付组件 简要说明该组件为封装了 微信,支付宝,银联支付, 一键快速集成,几行代码即可集成 微信,支付宝,银联支付. ## 示例: # 测试账号:1.银联支付:提供测试使用卡号.手机号信息 ...

  3. JavaScript数据结构 (手打代码)

    array: 数组创建: ); //创建一个长度为6的数组 ,,,,,); 数组方法: var str="I love javascript"; var single=str.sp ...

  4. 使用facebook和twitter进行分享经验总结

    凤凰涅槃,浴火重生. 在传说当中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于在人间的所有痛苦和恩怨情仇,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和与幸福.同样在肉体经受了巨大的痛 ...

  5. 排序算法之low B三人组

    排序low B三人组 列表排序:将无序列表变成有充列表 应用场景:各种榜单,各种表格,给二分法排序使用,给其他算法使用 输入无序列表,输出有序列表(升序或降序) 排序low B三人组 1. 冒泡排序 ...

  6. iOS-strong和copy【详细解读】

    strong和copy是常用到的修饰符,那么什么时候用strong,什么时候用copy,先上一段代码再说(以下代码直接在ViewController中写): 先定义两个数组 ///strong @pr ...

  7. iOS-隐藏Navigation导航栏线

    去除navigationBar上那条线: ///隐藏navigationBar导航栏线(直接写在UINavigationController-viewDidLoad方法里面即可) UIView *ba ...

  8. 夏令营提高班上午上机测试 Day 4 解题报告

    我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...

  9. UVA概率练习[2]

    UVa11021 Tribbles 你有K个麻球.一个只会存活一天.在死亡之前,一个麻球有P_i的概率生出i个麻球(i=0,1,…,n-1).m天后所有麻球都死亡的概率是多少?(包含在第m天前全部死亡 ...

  10. struct stat结构体简介

    在使用这个结构体和方法时,需要引入: <sys/types.h> <sys/stat.h> struct stat这个结构体是用来描述一个linux系统文件系统中的文件属性的结 ...