リフレクションを介してJava 16レコードの正規コンストラクタを認識する方法はありますか? 質問する

リフレクションを介して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));
    }
}

この記録を見つける方法はありますか?正規コンストラクタRecordHeaderリフレクション経由、つまり?で暗黙的に宣言されたもの。

ベストアンサー1

これを試して

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);
}

そして

Constructor<X> c = canonicalConstructorOfRecord(X.class);
X x = c.newInstance(1, 2);
System.out.println(x);

出力

X[i=1, j=2]

おすすめ記事