Java 8及以上版本反射无法获取方法参数名称

问题描述

Java 8及以上版本在请求api接口时,无法通过名称获取到参数

代码截图如下:

请求报文如下:

http 复制代码
POST /enable/params HTTP/1.1
Content-Type: application/json
Host: localhost:8096
Content-Length: 26

{
    "month": "2024-02"
}

问题原因

pom文件的build插件未指定-parameters参数

pom如下:

xml 复制代码
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

问题处理

在pom的插件中添加-parameters参数

pom如下:

xml 复制代码
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

代码截图如下:

问题分析

在Java 8之前,获取方法参数名称需要使用反射技术,但是这种方式只能获取到参数的类型,无法获取到参数的名称。因此,即使在源代码中定义了参数名称,也无法在运行时获取到。

从Java 8开始,编译器提供了一个新的选项,可以在编译时将参数名称添加到生成的字节码中,这样就可以在运行时使用反射来获取方法参数的名称了。然而,这个选项默认是关闭的,需要在编译时显式地启用。

如果在pom中没有使用这个选项,即使在源代码中定义了参数名称,也无法在运行时获取到。因此,如果想要在运行时获取到方法参数的名称,就必须在编译时启用这个选项,即在Maven的配置文件中添加<compilerArgs>参数,并设置为<arg>-parameters</arg>

相关推荐
涡能增压发动积13 小时前
同样的代码循环 10次正常 循环 100次就抛异常?自定义 Comparator 的 bug 让我丢尽颜面
后端
云烟成雨TD13 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Wenweno0o13 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
于慨13 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg32132113 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
tyung14 小时前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
gelald14 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川14 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月14 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming66614 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter