Tuve una clase:
class A { public final Integer orgId; }Lo reemplacé con el registro en Java 17:
record A (Integer orgId) { }Además, tenía un código que hizo una validación a través de la reflexión que funciona con la clase normal, pero no funciona con los Registros:
Field[] fields = obj.getClass().getFields(); //getting empty array here for the record for (Field field : fields) { }¿Cuál sería la forma correcta de obtener los campos del objeto Record y sus valores a través de la reflexión en Java 17?
Puedes usar el siguiente método:
RecordComponent[] getRecordComponents() Puede recuperar el nombre, el tipo, el tipo genérico, las anotaciones y su método de acceso desde RecordComponent .
Punto.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)); } }Producción:
10Alternativamente,
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)); } }Su class y record no son equivalentes: los registros tienen campos privados .
Class#getFields() solo devuelve campos públicos .
Podría usar Class#getDeclaredFields() en su lugar.