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
类文件属性而言,它们被视为普通成员。
想看看如何在 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
类文件属性而言,它们被视为普通成员。