java8中新增编译参数parameters入门

前言

java8新增了一个编译参数-parameters,可以让我们在运行期获取方法参数名称。

简单使用

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class TestParameter {
 public static void main(String[] args) throws Exception {
  Method testMethod = TestParameter.class.getDeclaredMethod("test", int.class);
  for (Parameter parameter : testMethod.getParameters()) {
      System.out.println(parameter.getName());
  }
 }

 private static void test(int num) {
  
 }
}

默认编译

javac TestParameter.java

运行结果为

arg0

添加编译参数编译

javac -parameters TestParameter.java

运行结果为

num

IDEA

IDEA设置编译参数

maven

maven设置编译参数,版本3.6.2之前

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.6.0</version>
   <configuration>
      <compilerArgs>-parameters</compilerArgs>
   </configuration>
</plugin>

版本3.6.2及之后

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.6.0</version>
   <configuration>
      <parameters>true</parameters>
   </configuration>
</plugin>

Spring框架

SpringBoot项目如果继承自spring-boot-starter-parent,会默认开启。

我们也可以查看最终生效的POM文件来确认这一点

看一个SpringMVC中使用到的例子

@GetMapping(value = "/{name}")
public String test(@PathVariable String name);

SpringMVC解析请求参数时,就会使用到这个特性。

主要使用到了DefaultParameterNameDiscoverer,这是一个组合类。

先通过StandardReflectionParameterNameDiscoverer获取,顾名思义通过反射来获取参数名称,如果我们在编译时没有添加这个编译参数,再通过LocalVariableTableParameterNameDiscoverer来获取,这个涉及到一个 局部变量表 的概念,内部是通过ASM(一个java字节码操作框架)来实现的。

参考

Java编译保留方法参数名称
启用maven_启用 parameters 编译选项简化 mybatis @Param 注解重复问题
How to compile Spring Boot applications with Java 8 --parameter flag
JAVA局部变量表

posted @ 2021-07-26 18:43  strongmore  阅读(3862)  评论(0编辑  收藏  举报