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

Record cannot get parameter names from constructors?

想看看如何在 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 中的参数名称,一般来说,不是你可以依赖的不改变的东西;它们是一个实现细节,默认情况下,编译器不会将它们保留在类文件中。

对于记录的 canonical 构造函数,参数名称必须与组件名称相匹配,这些被视为 类 public 的一部分API,因此被认为是稳定的。所以编译器将它们保留在类文件中,反射尽职尽责地为它们提供服务。 record的canonical constructor是强制性的,其形式由语言规定,所以比较特殊

对于其他构造函数,构造函数和参数名称都没有相同的意义,因此就 ParameterNames 类文件属性而言,它们被视为普通成员。