Luk*_*der 16 java reflection java-record java-16
假设我有这样的记录(或任何其他记录):
record X(int i, int j) {
X(int i) {
this(i, 0);
}
X() {
this(0, 0);
}
X(String i, String j) {
this(Integer.parseInt(i), Integer.parseInt(j));
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法通过反射找到这条记录的规范构造函数,即在RecordHeader?
sak*_*029 18
尝试这个
static <T extends Record> Constructor<T> canonicalConstructorOfRecord(Class<T> recordClass)
throws NoSuchMethodException, SecurityException {
Class<?>[] componentTypes = Arrays.stream(recordClass.getRecordComponents())
.map(rc -> rc.getType())
.toArray(Class<?>[]::new);
return recordClass.getDeclaredConstructor(componentTypes);
}
Run Code Online (Sandbox Code Playgroud)
和
Constructor<X> c = canonicalConstructorOfRecord(X.class);
X x = c.newInstance(1, 2);
System.out.println(x);
Run Code Online (Sandbox Code Playgroud)
输出
X[i=1, j=2]
Run Code Online (Sandbox Code Playgroud)
这似乎有效,虽然它有点蹩脚:
List<?> componentTypes = Stream
.of(X.class.getRecordComponents())
.map(RecordComponent::getType)
.toList();
for (Constructor<?> c : X.class.getDeclaredConstructors())
if (Arrays.asList(c.getParameterTypes()).equals(componentTypes))
System.out.println(c);
Run Code Online (Sandbox Code Playgroud)
印刷
Test$1X(int,int)
Run Code Online (Sandbox Code Playgroud)
我仍然愿意接受更好的建议。