5

私はクラスを持っていました:

class A {
   public final Integer orgId;
}

Java 17 のレコードに置き換えました。

record A (Integer orgId) {
}

また、通常のクラスでは機能するが、レコードでは機能しないリフレクションを介して検証を行うコードがありました。

Field[] fields = obj.getClass().getFields(); //getting empty array here for the record
for (Field field : fields) {
}

Java 17 でリフレクションを介して Record オブジェクト フィールドとその値を取得する正しい方法は何でしょうか?

4

2 に答える 2

8

次の方法を使用できます。

RecordComponent[] getRecordComponents()

から、名前、型、ジェネリック型、注釈、およびそのアクセサ メソッドを取得できますRecordComponent

Point.java:

record Point(int x, int y) { }

RecordDemo.java:

import java.lang.reflect.RecordComponent;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class RecordDemo {
    public static void main(String args[]) throws InvocationTargetException, IllegalAccessException {
        Point point = new Point(10,20);
        RecordComponent[] rc = Point.class.getRecordComponents();
        System.out.println(rc[0].getAccessor().invoke(point));
    }
}

出力:

10

あるいは、

import java.lang.reflect.RecordComponent;
import java.lang.reflect.Field;

public class RecordDemo {
    public static void main(String args[]) 
            throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException {
        Point point = new Point(10, 20);
        RecordComponent[] rc = Point.class.getRecordComponents();      
        Field field = Point.class.getDeclaredField(rc[0].getAccessor().getName());  
        field.setAccessible(true); 
        System.out.println(field.get(point));
    }
}
于 2021-10-13T11:01:05.943 に答える