21
21
import java .beans .Introspector ;
22
22
import java .beans .PropertyDescriptor ;
23
23
import java .lang .reflect .Method ;
24
+ import java .lang .reflect .RecordComponent ;
24
25
import java .lang .reflect .Type ;
25
26
import java .util .LinkedHashSet ;
26
27
import java .util .Set ;
@@ -90,20 +91,28 @@ private void registerReflectionHints(ReflectionHints hints, Set<Type> seen, Type
90
91
}
91
92
seen .add (type );
92
93
if (shouldRegisterMembers (clazz )) {
93
- builder .withMembers (
94
- MemberCategory .DECLARED_FIELDS ,
95
- MemberCategory .INVOKE_DECLARED_CONSTRUCTORS );
96
- try {
97
- BeanInfo beanInfo = Introspector .getBeanInfo (clazz );
98
- PropertyDescriptor [] propertyDescriptors = beanInfo .getPropertyDescriptors ();
99
- for (PropertyDescriptor propertyDescriptor : propertyDescriptors ) {
100
- registerPropertyHints (hints , seen , propertyDescriptor .getWriteMethod (), 0 );
101
- registerPropertyHints (hints , seen , propertyDescriptor .getReadMethod (), -1 );
94
+ if (clazz .isRecord ()) {
95
+ builder .withMembers (MemberCategory .INVOKE_DECLARED_CONSTRUCTORS );
96
+ for (RecordComponent recordComponent : clazz .getRecordComponents ()) {
97
+ registerRecordHints (hints , seen , recordComponent .getAccessor ());
102
98
}
103
99
}
104
- catch (IntrospectionException ex ) {
105
- if (logger .isDebugEnabled ()) {
106
- logger .debug ("Ignoring referenced type [" + clazz .getName () + "]: " + ex .getMessage ());
100
+ else {
101
+ builder .withMembers (
102
+ MemberCategory .DECLARED_FIELDS ,
103
+ MemberCategory .INVOKE_DECLARED_CONSTRUCTORS );
104
+ try {
105
+ BeanInfo beanInfo = Introspector .getBeanInfo (clazz );
106
+ PropertyDescriptor [] propertyDescriptors = beanInfo .getPropertyDescriptors ();
107
+ for (PropertyDescriptor propertyDescriptor : propertyDescriptors ) {
108
+ registerPropertyHints (hints , seen , propertyDescriptor .getWriteMethod (), 0 );
109
+ registerPropertyHints (hints , seen , propertyDescriptor .getReadMethod (), -1 );
110
+ }
111
+ }
112
+ catch (IntrospectionException ex ) {
113
+ if (logger .isDebugEnabled ()) {
114
+ logger .debug ("Ignoring referenced type [" + clazz .getName () + "]: " + ex .getMessage ());
115
+ }
107
116
}
108
117
}
109
118
}
@@ -115,6 +124,15 @@ private void registerReflectionHints(ReflectionHints hints, Set<Type> seen, Type
115
124
referencedTypes .forEach (referencedType -> registerReflectionHints (hints , seen , referencedType ));
116
125
}
117
126
127
+ private void registerRecordHints (ReflectionHints hints , Set <Type > seen , Method method ) {
128
+ hints .registerMethod (method , INVOKE );
129
+ MethodParameter methodParameter = MethodParameter .forExecutable (method , -1 );
130
+ Type methodParameterType = methodParameter .getGenericParameterType ();
131
+ if (!seen .contains (methodParameterType )) {
132
+ registerReflectionHints (hints , seen , methodParameterType );
133
+ }
134
+ }
135
+
118
136
private void registerPropertyHints (ReflectionHints hints , Set <Type > seen , @ Nullable Method method , int parameterIndex ) {
119
137
if (method != null && method .getDeclaringClass () != Object .class
120
138
&& method .getDeclaringClass () != Enum .class ) {
0 commit comments