Search code examples
javareflectionjava-recordjava-16

Is there a way to recognise a Java 16 record's canonical constructor via reflection?


Assuming I have a record like this (or any other record):

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

Is there a way to find this record's canonical constructor via reflection, i.e. the one that is implicitly declared in the RecordHeader?


Solution

  • Try this

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

    And

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

    Output

    X[i=1, j=2]