Java获取方法参数名称方案||SpringBoot配置顺序注解


一: Java获取方法参数名称的方法


普盲:

getDeclaredMethods与getMethods的的区别

1、getMethods返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口的公共 member 方法。
2、getDeclaredMethods返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

也就是说getDeclaredMethods能拿到所有(不包括继承的方法),而getMethods只能拿到public方法(包括继承的类或接口的方法)

还有只得注意的是这两个方法返回的数组中的元素的顺序是无序的,它和你在类中定义方法的顺序无关



获取方法参数名的方式
虽然Java编译器默认情况下会抹去方法的参数名,但有上面介绍了字节码的相关知识可知,我们还是有方法来得到方法的参数名的。

方法一:使用-parameters(最简单直接)
java8原生支持,直接通过java.lang.reflect.Parameter就能获取到

方法二:借助ASM(推荐)

它是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能,它能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
这样我们就可以通过ASM来分析字节码信息中的本地变量表获取方法参数名了。



实例代码:

package org.jd.auth.data.security.spring.cloud.server.controller;import org.jd.auth.data.security.spring.cloud.server.dto.UserDto;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class UserController {// 通过Spring MVC的LocalVariableTableParameterNameDiscoverer 获取Controller层的方法参数public void testArguments(String test,Integer myInteger,boolean booleanTest){}public void test(){}@RequestMapping("/api/users")private ResponseEntity<UserDto> getUser(UserDto userDto, UserDetails userDetails){User user  = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();String email = user.getUsername()+"@163.com";userDto.setName(user.getUsername());userDto.setEmail(email);return ResponseEntity.ok(userDto);}
}


获取:UserController 中的自定义方法参数名称 


package org.jd.auth.data.security.spring.cloud.server;import org.jd.auth.data.security.spring.cloud.server.controller.UserController;
import org.junit.Test;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;/*** 获取某个Controller层的自定义方法的参数名称*/
public class UserControllerMethodsParametersResolve {@Testpublic void test() {LocalVariableTableParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();// 获取当前类自定义的的非构造所有方法Method[] methods = UserController.class.getDeclaredMethods(); // 获取的是类本身具有的方法,getMethods()获取除了私有方法以为的方法,而getDeclaredMethods()方法获取的是该类中自定义的方法for (Method method : methods) {String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);System.out.println("方法名称 :" + method.getName());int parameterCount = method.getParameterCount();System.out.println("方法参数总数:" + parameterCount);if (parameterNames != null) {StringBuffer sb = new StringBuffer();for (String param : parameterNames) {sb.append(param).append("\t,");}System.out.println("方法参数为 : " + sb.toString());} else {System.out.println("无参数 ");}}System.out.println("============================================================");Constructor[] constructors = UserController.class.getConstructors();for (Constructor constructor : constructors) {// 获取构造方法的参数String[] parameterNames = parameterNameDiscoverer.getParameterNames(constructor);System.out.println("构造方法名称 :" + constructor.getName());if (parameterNames != null) {StringBuffer sb = new StringBuffer();for (String param : parameterNames) {sb.append(param).append("\t,");}System.out.println("构造方法参数为 : " + sb.toString());} else {System.out.println("构造无参数 ");}}}}


运行实例效果如下:



Start: MyBatis Log EasyPlus
方法名称 :test
方法参数总数:0
方法参数为 : 
方法名称 :getUser
方法参数总数:2
方法参数为 : userDto    ,userDetails    ,
方法名称 :testArguments
方法参数总数:3
方法参数为 : test    ,myInteger    ,booleanTest    ,
============================================================
构造方法名称 :org.jd.auth.data.security.spring.cloud.server.controller.UserController
构造方法参数为 : 
 



二:Spring Boot配置加载顺序的几个注解



Spring Boot会根据当前容器内的情况来动态的判断自动配置类的配置顺序,它给我们提供了@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder 三大注解:


@AutoConfigureBefore:用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后配置


@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
    
}



@AutoConfigureAfter:用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之前配置。


@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
    
}



@AutoConfigureOrder:确定配置加载的优先级顺序,表示绝对顺序(数字越小,优先顺序越高)


// 自动配置里面的最高优先级
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) 
@Configuration
@ConditionalOnWebApplication // 仅限于web应用
@Import(BeanPostProcessorsRegistrar.class) // 导入内置容器的设置
public class EmbeddedServletContainerAutoConfiguration {

}
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/285210.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python绘图matplotlib——使用记录2

本博文来自于网络收集&#xff0c;如有侵权请联系删除 三维图绘制 1 三维散点图2 三维柱状图三维曲面 1 三维散点图 import matplotlib.pyplot as plt import numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig plt.figure() # ax fig.gca(projection"3d")…

Docker(二):Docker常用命令

docker 查看docker支持的所有命令和参数。 ➜ ~ docker Management Commands:config Manage Docker configscontainer Manage containersimage Manage imagesnetwork Manage networksnode Manage Swarm nodesplugin Manage pluginssecret …

操作系统究竟是什么?在计算机体系中扮演什么角色?

操作系统究竟是什么&#xff1f;在计算机体系中扮演什么角色&#xff1f; 一、操作系统概念二、操作系统如何管理软硬件资源2.1 何为管理者2.2 操作系统如何管理硬件 三、系统调用接口作用四、用户操作接口五、广义操作系统和狭义操作系统 一、操作系统概念 下面是来自百度百科…

51单片机学习笔记——LED闪烁和流水灯

任务分析 首先要知道LED闪烁主要是怎么工作的&#xff0c;闪烁亮灭自然是一下为高一下为低&#xff0c;亮灭的频率则需要延时来进行控制。 上节已经知道了如何点亮那延时如何做呢首先先编写主框架 这样是否可以通过循环将LED灯一直循环闪烁。 以为while一直在循环所以其实是可…

【评分标准】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷 无线网络勘测设计

第一部分&#xff1a;无线网络勘测设计评分标准 序号评分项评分细项评分点说明评分方式分值1点位设计图AP编号AP编号符合“AP型号位置编号”完全匹配5AP型号独立办公室、小型会议室选用WALL AP110完全匹配5员工寝室选用智分&#xff0c;其他用放装完全匹配5其它区域选用放装AP…

设计模式(十二):中介者模式(行为型模式)

Mediator&#xff0c;中介者模式&#xff1a;用一个中介对象封装一些列的对象交互。属于行为型模式 Facade&#xff0c;外观模式&#xff1a;为子系统中的一组接口提供一致的界面&#xff0c;facade 提供了一高层接口&#xff0c;这个接口使得子系统更容易使用。属于结构型模式…

Linux升级GCC

文章目录 一、安装 EPEL 仓库二、更新yum三、安装 CentOS 开发工具组四、安装scl五、安装gcc 11六、启用gcc 11七、设置永久使用 一、安装 EPEL 仓库 命令&#xff1a; yum install epel-release -y二、更新yum 命令&#xff1a; yum update -y三、安装 CentOS 开发工具组 …

opencv各个模块介绍(2)

Features2D 模块&#xff1a;特征检测和描述子计算模块&#xff0c;包括SIFT、SURF等算法。 Features2D 模块提供了许多用于特征检测和描述子匹配的函数和类&#xff0c;这些函数和类可用于图像特征的提取、匹配和跟踪。 FeatureDetector&#xff1a;特征检测器的基类&#xf…

[BT]BUUCTF刷题第6天(3.24)

第6天 Web [极客大挑战 2019]PHP Payload&#xff1a; O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}这道题考点是网站源码备份文件泄露和PHP反序列化&#xff0c;有篇介…

t-rex2开放集目标检测

论文链接&#xff1a;http://arxiv.org/abs/2403.14610v1 项目链接&#xff1a;https://github.com/IDEA-Research/T-Rex 这篇文章的工作是基于t-rex1的工作继续做的&#xff0c;核心亮点&#xff1a; 是支持图片/文本两种模态的prompt进行输入&#xff0c;甚至进一步利用两…

013_Linux(上传rz,下载sz,tar,zip,unzip)

目录 一、上传、下载 1、通过鼠标操作 &#xff08;1&#xff09;下载 &#xff08;2&#xff09;上传 2、通过命令操作 rz、sz &#xff08;1&#xff09;下载 sz &#xff08;2&#xff09;上传 rz 二、压缩、解压 1、tar命令 &#xff08;1&#xff09;压缩 &…

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用&#xff1a;https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后&#xff0c;需要将安装目录添加到环境变…

vscode的一些技巧

技巧1&#xff1a;调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项&#xff1a; “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2&#xff1a;断点 普通断点使…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

Python 全栈系列236 rabbit_agent搭建

说明 通过rabbit_agent, 以接口方式实现对队列的标准操作&#xff0c;将pika包在微服务内&#xff0c;而不必在太多地方重复的去写。至少在服务端发布消息时&#xff0c;不必再去考虑这些问题。 在分布式任务的情况下&#xff0c;客户端本身会启动一个持续监听队列的客户端服…

Java研学-SpringBoot(二)

二 Spring Boot 介绍 1 简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;主要目标是简化Spring应用程序的配置和部署过程&#xff0c;减少开发者在项目搭建和配置上的工作量&#xff0c;让开发者能够更专注于业务逻辑的实现。它使用特定的方式来进行配置&#xff0…

Request请求参数----中文乱码问题

一: GET POST获取请求参数: 在处理为什么会出现中文乱码的情况之前, 首先我们要直到GET 以及 POST两种获取请求参数的不同 1>POST POST获取请求参数是通过输入流getReader来进行获取的, 通过字符输入流来获取响应的请求参数, 并且在解码的时候, 默认的情况是 ISO_885…

基于SpringBoot+Vue+Mybatis的408刷题小程序管理端

简介 原始数据&#xff1a;书目信息、章节信息、题目信息、系统菜单、系统角色、系统用户。 主要任务&#xff1a;系统主要采用spring boot作为后端框架&#xff0c;前端使用vueelementUI&#xff0c;为408刷题小程序提供一个方面的管理和维护的任务&#xff0c;主要功能包括…

图解Kafka架构学习笔记(三)

准备Kafka环境 这里推荐使用Docker Compose快速搭建一套本地开发环境。 以下docker-compose.yml文件用来搭建一套单节点zookeeper和单节点kafka环境&#xff0c;并且在8080端口提供kafka-ui管理界面。 version: 2.1services:zoo1:image: confluentinc/cp-zookeeper:7.3.2hos…

day6:STM32MP157——串口通信实验

使用的是cortex A7内核 【串口通信的工作原理】 本次实验使用的是uart4的串口&#xff0c;分别使用了uart4_tx和uart4_rx两个引脚。根据板子的原理图我们可以知道&#xff0c;他们分别对应着芯片的PG11和PB2 从引脚名字也可以知道使用了GPIO口&#xff0c;所以本次实验同样需…