通过Java反射获取对象上的注解,java反射注解妙用-获取所有接口说明
原标题: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反射注解妙用-获取所有接口说明相关推荐
- Java web文件的上传和下载、注解
文章目录 1.文件上传 2.文件下载 3.用户登陆注册时的显示头像 4.注解 与interface的区别 元注解 1.文件上传 文件上传:将客户端的文件,保存到服务器端,比如在用户注册的时候要求用户上 ...
- java获取服务器上指定文件,java 读取服务器上文件
java 读取服务器上文件 [2021-02-04 10:02:14] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...
- Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)
阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 定义:被java赋予特殊含义的字符串(单词): 关 ...
- java云服务器怎么上传文件大小,java云服务器怎么上传文件大小
java云服务器怎么上传文件大小 内容精选 换一换 SAP S/4HANA实例节点数据磁盘需要进行格式化,并挂载到相应的目录后,才能被正常使用.登录待安装SAP S/4HANA的云服务器"s ...
- java lisp,摸索JVM上的LISP[Java编程]
赞助商链接 本文"摸索JVM上的LISP[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其 ...
- java 同步 变量,在java中的对象上同步,然后更改同步的变量的值
I came across a code like this synchronized(obj) { obj = new Object(); } Something does not feel rig ...
- JAVA类与对象tank_5.编写一个java程序,该程序有两个类:Tank(用于刻画坦克)和Fight(主类)。 已知坦克类如下:...
5.编写一个java程序,该程序有两个类:Tank(用于刻画坦克)和Fight(主类). 已知坦克类如下: public classTank{ double speed; //坦克速度 ...
- java父原型,对象及原型丶Java教程网-IT开发者们的技术天堂
目录 创建对象 字面量 创建对象 new Object() 创建对象 获取.设置对象属性 obj.key 获取/设置obj的key属性的值value obj['key'] 获取/设置obj的key属性 ...
- java 打印对象属性 工具类_关于java实现任意对象输出字符串的工具类ObjectUtils用户打印日志、接口调试及监控等...
通过该对象工具类ObjectUtils(参考org.springframework.util.ObjectUtils)实现了类集.数组及基本数据类型转换及字符串输出,常用在日志输出打印.接口联调及对象 ...
最新文章
- mysql主从切换gtid不一致_GTID 复制、主从不一致跳过操作、快速切换master
- c语言怎么往栈中输入元素,C语言栈操作
- linux开发工具之gcc
- linux一g运行内存不足,在linux运行weblogic出现运行内存不足错误,求鞭挞....
- Java-控制台接受用户输入数据的方法
- SVN报错:can't open file db/txn-current-lock:permission denied
- python下载安装教程-Python和Anoconda和Pycharm安装教程
- 使用高德地图打车软件实现_强化学习:使用Q学习来打车!
- 程序猿崛起2——互联网时代下的新潮流和新活法
- 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(一)
- 来来来,给你看个宝贝儿~
- 威廉玛丽学院计算机专业,威廉玛丽学院专业设置有哪些?
- 171221—8421BCD码、进制转换
- 微信小程序8-云函数
- 如何重置Mac的蓝牙模块以解决连接问题
- Android:证书生成
- 简单JS小案例:五星好评
- JavaScript 笔记-放大镜案例
- 利用Biopython 快速根据pmid 来下载参考文献信息
- Python全栈笔记(练习题,持续更新)
热门文章
- pg 日期和时间的运算操作
- 基于JAVA+SpringMVC+Mybatis+MYSQL的bbs论坛管理系统
- 基于JAVA+SpringMVC+Mybatis+MYSQL的房屋租赁管理系统
- 作业帮:最长连续序列(头部插入)
- Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
- ngnix集群产生的问题
- Win10 中将网页转换成pdf的简便方法
- electron 前端开发桌面应用
- 《程序员面试金典》+《算法导论》
- (转)【MySQL】sync_binlog innodb_flush_log_at_trx_commit 浅析