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 {
    @Test
    public 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 {

}
 

 

  • 25
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
00、_SpringBoot_源码、课件 01、_SpringBoot_入门-课程简介 02、_SpringBoot_入门-Spring Boot简介 03、_SpringBoot_入门-微服务简介 04、_SpringBoot_入门-环境准备 7 f( h1 U' D5 W: F 05、_SpringBoot_入门-springboot-helloworld 06、_SpringBoot_入门-HelloWorld细节-场景启动器(starter) 1 i4 |2 Y* ~: s6 d! U4 w 07、_SpringBoot_入门-HelloWorld细节-自动配置 08、_SpringBoot_入门-使用向导快速创建Spring Boot应用 09、_SpringBoot_配置-yaml简介 10、_SpringBoot_配置-yaml语法 2 L( g0 e) J) F# r 11、_SpringBoot_配置-yaml配置文件值获取 , y( ] x3 r% o7 ]5 i 12、_SpringBoot_配置-properties配置文件编码问题 13、_SpringBoot_配置-@ConfigurationProperties与@Value区别 14、_SpringBoot_配置-@PropertySource、@ImportResource、@Bean 15、_SpringBoot_配置-配置文件占位符 16、_SpringBoot_配置-Profile多环境支持 ( h, f6 Y' s! ]9 v! _5 J% ^+ `, ^ 17、_SpringBoot_配置-配置文件的加载位置 18、_SpringBoot_配置-外部配置加载顺序 19、_SpringBoot_配置-自动配置原理 6 o* r% s4 }/ ]! Z8 N 20、_SpringBoot_配置-@Conditional&自动配置报告 21、_SpringBoot_日志-日志框架分类和选择 . j9 D4 P0 K T" k5 N+ p 22、_SpringBoot_日志-slf4j使用原理 0 F! O) ~6 Z0 v) P. ]7 W 23、_SpringBoot_日志-其他日志框架统一转换为slf4j 24、_SpringBoot_日志-SpringBoot日志关系 3 `! [7 \+ D; \- V( t! @ 25、_SpringBoot_日志-SpringBoot默认配置 8 I. H$ s/ I' {- P0 |2 R1 Y 26、_SpringBoot_日志-指定日志文件和日志Profile功能 27、_SpringBoot_日志-切换日志框架 28、_SpringBoot_web开发-简介 29、_SpringBoot_web开发-webjars&静态资源映射规则 30、_SpringBoot_web开发-引入thymeleaf 5 g- Q" y) P7 Q7 O 31、_SpringBoot_web开发-thymeleaf语法 . V# ?; k. ^2 F0 Y! L9 a4 r: w% t; r 32、_SpringBoot_web开发-SpringMVC自动配置原理 33、_SpringBoot_web开发-扩展与全面接管SpringMVC 34、_SpringBoot_web开发-【实验】-引入资源 3 U) ]" ^8 ~+ h. m9 w8 Z 35、_SpringBoot_web开发-【实验】-国际化 36、_SpringBoot_web开发-【实验】-登陆&拦截器 $ |' \$ J3 {' e6 G" m) h( o" F 37、_SpringBoot_web开发-【实验】-Restful实验要求 & J/ l' y/ p& k5 o/ M" a) m 38、_SpringBoot_web开发-【实验】-员工列表-公共页抽取 39、_SpringBoot_web开发-【实验】-员工列表-链接高亮&列表完成 + M: X6 ~0 \* s+ C1 J( i" \+ J5 G 40、_SpringBoot_web开发-【实验】-员工添加-来到添加页面 ' c# g2 G0 }8 k+ b 41、_SpringBoot_web开发-【实验】-员工添加-添加完成 ; N. \+ [3 u% {8 }& h 42、_SpringBoot_web开发-【实验】-员工修改-重用页面&修改完成 43、_SpringBoot_web开发-【实验】-员工删除-删除完成 & h/ J7 X# {$ q 44、_SpringBoot_web开发-错误处理原理&定制错误

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值