java - Record 无法从构造函数中获取参数名称?

标签 java constructor java-record java-16

看看如何在 Java 16 下使用反射记录(和 15 相同的行为)

public record RecordTest2(int id, int something, double total, LocalDateTime createdOn) {

    public RecordTest2(int id, int something, double total) {
        this(id, something, total, LocalDateTime.now());
    }
}
查看规范构造函数,我确实看到了参数名称,但没有看到其他名称。
var recordTest2 = new RecordTest2(1, 2, 3.0, LocalDateTime.now());
Class<?> objectClass = recordTest2.getClass();

Constructor<?>[] constructors = objectClass.getConstructors();

for (Constructor<?> con : constructors) {
    System.out.println(con.getName());
    Parameter[] parameters = con.getParameters();
    for (Parameter parameter : parameters) {
        System.out.printf("param: %s\n", parameter.getName());
    }
}
输出:
net.sf.persism.dao.records.RecordTest2
param: arg0
param: arg1
param: arg2
net.sf.persism.dao.records.RecordTest2
param: id
param: something
param: total
param: createdOn
有什么解决方法吗?
编辑:只是在这里点“我”。我可以使用 java.beans 中的 @ConstructorProperties 注释。

最佳答案

这是按设计工作的。通常,Java API 中的参数名称不是您可以依赖而不会更改的东西。它们是一个实现细节,默认情况下,编译器不会将它们保留在类文件中。
对于记录的规范构造函数,参数名称必须与组件名称匹配,并且这些名称被认为是类公共(public) API 的一部分,因此被认为是稳定的。因此编译器将它们保留在类文件中,反射尽职尽责地为它们提供服务。记录的规范构造函数是强制性的,它的形式是由语言指定的,所以这种方式比较特殊。
对于其他构造函数,构造函数和参数名称都没有相同的意义,因此在 ParameterNames 中它们被视为普通成员。类文件属性。

关于java - Record 无法从构造函数中获取参数名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67038058/

相关文章:

java - jsoup 获得特定值

Java : can't call overloaded constructor

Scala.js 原生 Javascript 构造函数

java 构造函数,其参数具有最大值

java - 使用新的 Record 类时无法反序列化

java - Lombok getter/setter vs Java 14 记录

java - 无法使用JSP从mySQL数据库获取数据

java - Hibernate 干扰 Javamail 日志记录

java - 如何将 C++ 变量传递给处理脚本?