一: 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 {}