原标题:java反射注解妙用-获取所有接口说明

转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10293490.html

前言

最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进行了重构。而权限管理需要用到所有的接口配置,包括接口url地址,接口唯一编码等。想要收集所有的接口信息,如果工程接口很多,工作量可想而知。

这里用了反射,来获取所有接口的信息,接口再多,也不过几秒钟的事。

使用

Auth.java

接口信息对象

主要包括授权地址,权限唯一标识,权限名称,创建时间,请求方式

package com.wwj.springboot.model; import java.io.Serializable; import java.util.Date; public class Auth implements Serializable { private String authName; private String authUrl; private String authUniqueMark; private Date createTime; private String methodType; //get set 省略 }

UserController.java

用户接口

用于测试的接口。

这里使用了标准的restful接口风格,swagger自动API接口,shiro 接口权限注解@RequiresPermissions组合成的一个controller。当然也可以使用其他技术,只要能获取到接口信息就行。

注解不重要,重要的是注解里的信息。

package com.wwj.springboot.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/users") @Api(value = "用户管理", tags = {"用户管理"}) public class UserController { @GetMapping @ApiOperation("获取列表") @RequiresPermissions("user:list") public void list() { System.out.println(); } @GetMapping(path = "/{userId}") @ApiOperation("获取详情") @RequiresPermissions("user:get") public void getUserById(@PathVariable("userId") String userId) { System.out.println(); } @PostMapping @ApiOperation("新增一个用户") @RequiresPermissions("user:save") public void save() { System.out.println(); } @PutMapping("/{userId}") @ApiOperation("修改保存") @RequiresPermissions("user:update") public void editSave(@PathVariable String userId) { System.out.println(); } }

主函数

这里通过反射,获取了UserController的所有接口的说明,并存入数据库中。这是最主要的类。

1.设置扫描的package路径

Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage(scanPackage)).setScanners(new MethodAnnotationsScanner()));

2.获取到扫描包内带有@RequiresPermissions注解的所有方法集合

Set methods = reflections.getMethodsAnnotatedWith(RequiresPermissions.class);

3.通过反射获取类上的注解

method.getDeclaringClass().getAnnotation(RequestMapping.class);

4.通过反射获取方法上的注解

method.getAnnotation(PutMapping.class);

5.获取注解中的某个属性(这里是获取value属性)

method.getAnnotation(PutMapping.class).value();

完整的主函数代码

package com.wwj.springboot; import com.alibaba.fastjson.JSON; import com.wwj.springboot.model.Auth; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.reflections.Reflections; import org.reflections.scanners.MethodAnnotationsScanner; import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; import org.springframework.web.bind.annotation.*; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; public class AnnoTest { public static void main(String[] args) { getRequestMappingMethod("com.wwj.springboot.controller"); } /** * @param scanPackage 需要扫描的包路径 */ private static void getRequestMappingMethod(String scanPackage) { //设置扫描路径 Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage(scanPackage)).setScanners(new MethodAnnotationsScanner())); //扫描包内带有@RequiresPermissions注解的所有方法集合 Set methods = reflections.getMethodsAnnotatedWith(RequiresPermissions.class); List list = new ArrayList<>(); Date now = new Date(); //循环获取方法 methods.forEach(method -> { //用于保存方法的请求类型 String methodType = ""; //获取类上的@RequestMapping注解的值,作为请求的基础路径 String authUrl = method.getDeclaringClass().getAnnotation(RequestMapping.class).value()[0]; //获取方法上的@PutMapping,@GetMapping,@PostMapping,@DeleteMapping注解的值,作为请求路径,并区分请求方式 if (method.getAnnotation(PutMapping.class) != null) { methodType = "put"; if (method.getAnnotation(PutMapping.class).value().length > 0) { authUrl = method.getAnnotation(PutMapping.class).value()[0]; } } else if (method.getAnnotation(GetMapping.class) != null) { methodType = "get"; if (method.getAnnotation(GetMapping.class).value().length > 0) { authUrl = method.getAnnotation(GetMapping.class).value()[0]; } } else if (method.getAnnotation(PostMapping.class) != null) { methodType = "post"; if (method.getAnnotation(PostMapping.class).value().length > 0) { authUrl = method.getAnnotation(PostMapping.class).value()[0]; } } else if (method.getAnnotation(DeleteMapping.class) != null) { if (method.getAnnotation(DeleteMapping.class).value().length > 0) { authUrl = method.getAnnotation(DeleteMapping.class).value()[0]; } } //使用Auth对象来保存值 Auth auth = new Auth(); auth.setMethodType(methodType); auth.setAuthUniqueMark(method.getAnnotation(RequiresPermissions.class).value()[0]); auth.setAuthUrl(authUrl); auth.setAuthName(method.getDeclaringClass().getAnnotation(Api.class).value() + "-" + method.getAnnotation(ApiOperation.class).value()); auth.setCreateTime(now); list.add(auth); }); //TODO 输出到控制台,此处存数据库即可 System.out.println(JSON.toJSONString(list)); } }

通过上面所说的方法即可获取到注解中的值,这样就可以获取到我们想要的接口信息了,执行结果如下

[{"authName":"用户管理-获取详情","authUniqueMark":"user:get","authUrl":"/users","createTime":1540977757616,"methodType":"get"}, {"authName":"用户管理-新增一个用户","authUniqueMark":"user:save","authUrl":"/users","createTime":1540977757616,"methodType":"post"}, {"authName":"用户管理-修改保存","authUniqueMark":"user:update","authUrl":"/{userId}","createTime":1540977757616,"methodType":"put"}, {"authName":"用户管理-获取列表","authUniqueMark":"user:list","authUrl":"/users","createTime":1540977757616,"methodType":"get"}]

本文欢迎各位转载,但是转载文章之后必须在文章开头给出原文链接。

作者:俊俊的小熊饼干

原文:https://www.cnblogs.com/wenjunwei/p/10293490.html

责任编辑:

通过Java反射获取对象上的注解,java反射注解妙用-获取所有接口说明相关推荐

  1. Java web文件的上传和下载、注解

    文章目录 1.文件上传 2.文件下载 3.用户登陆注册时的显示头像 4.注解 与interface的区别 元注解 1.文件上传 文件上传:将客户端的文件,保存到服务器端,比如在用户注册的时候要求用户上 ...

  2. java获取服务器上指定文件,java 读取服务器上文件

    java 读取服务器上文件 [2021-02-04 10:02:14]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

  3. Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)

    阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 ​ 定义:被java赋予特殊含义的字符串(单词): ​ 关 ...

  4. java云服务器怎么上传文件大小,java云服务器怎么上传文件大小

    java云服务器怎么上传文件大小 内容精选 换一换 SAP S/4HANA实例节点数据磁盘需要进行格式化,并挂载到相应的目录后,才能被正常使用.登录待安装SAP S/4HANA的云服务器"s ...

  5. java lisp,摸索JVM上的LISP[Java编程]

    赞助商链接 本文"摸索JVM上的LISP[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其 ...

  6. java 同步 变量,在java中的对象上同步,然后更改同步的变量的值

    I came across a code like this synchronized(obj) { obj = new Object(); } Something does not feel rig ...

  7. JAVA类与对象tank_5.编写一个java程序,该程序有两个类:Tank(用于刻画坦克)和Fight(主类)。 已知坦克类如下:...

    5.编写一个java程序,该程序有两个类:Tank(用于刻画坦克)和Fight(主类). 已知坦克类如下: public classTank{ double speed;        //坦克速度 ...

  8. java父原型,对象及原型丶Java教程网-IT开发者们的技术天堂

    目录 创建对象 字面量 创建对象 new Object() 创建对象 获取.设置对象属性 obj.key 获取/设置obj的key属性的值value obj['key'] 获取/设置obj的key属性 ...

  9. java 打印对象属性 工具类_关于java实现任意对象输出字符串的工具类ObjectUtils用户打印日志、接口调试及监控等...

    通过该对象工具类ObjectUtils(参考org.springframework.util.ObjectUtils)实现了类集.数组及基本数据类型转换及字符串输出,常用在日志输出打印.接口联调及对象 ...

最新文章

  1. mysql主从切换gtid不一致_GTID 复制、主从不一致跳过操作、快速切换master
  2. c语言怎么往栈中输入元素,C语言栈操作
  3. linux开发工具之gcc
  4. linux一g运行内存不足,在linux运行weblogic出现运行内存不足错误,求鞭挞....
  5. Java-控制台接受用户输入数据的方法
  6. SVN报错:can't open file db/txn-current-lock:permission denied
  7. python下载安装教程-Python和Anoconda和Pycharm安装教程
  8. 使用高德地图打车软件实现_强化学习:使用Q学习来打车!
  9. 程序猿崛起2——互联网时代下的新潮流和新活法
  10. 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(一)
  11. 来来来,给你看个宝贝儿~
  12. 威廉玛丽学院计算机专业,威廉玛丽学院专业设置有哪些?
  13. 171221—8421BCD码、进制转换
  14. 微信小程序8-云函数
  15. 如何重置Mac的蓝牙模块以解决连接问题
  16. Android:证书生成
  17. 简单JS小案例:五星好评
  18. JavaScript 笔记-放大镜案例
  19. 利用Biopython 快速根据pmid 来下载参考文献信息
  20. Python全栈笔记(练习题,持续更新)

热门文章

  1. pg 日期和时间的运算操作
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的bbs论坛管理系统
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的房屋租赁管理系统
  4. 作业帮:最长连续序列(头部插入)
  5. Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
  6. ngnix集群产生的问题
  7. Win10 中将网页转换成pdf的简便方法
  8. electron 前端开发桌面应用
  9. 《程序员面试金典》+《算法导论》
  10. (转)【MySQL】sync_binlog innodb_flush_log_at_trx_commit 浅析