1515 */
1616package org .springframework .data .core ;
1717
18+ import kotlin .jvm .JvmClassMappingKt ;
19+ import kotlin .jvm .internal .PropertyReference ;
20+ import kotlin .reflect .KClass ;
21+ import kotlin .reflect .KProperty1 ;
22+
1823import java .io .IOException ;
1924import java .io .InputStream ;
2025import java .lang .invoke .MethodHandleInfo ;
3338import org .apache .commons .logging .Log ;
3439import org .apache .commons .logging .LogFactory ;
3540import org .jspecify .annotations .Nullable ;
36-
3741import org .springframework .asm .ClassReader ;
3842import org .springframework .asm .ClassVisitor ;
3943import org .springframework .asm .Label ;
4044import org .springframework .asm .MethodVisitor ;
4145import org .springframework .asm .Opcodes ;
4246import org .springframework .asm .SpringAsmInfo ;
4347import org .springframework .asm .Type ;
48+ import org .springframework .core .KotlinDetector ;
4449import org .springframework .core .SpringProperties ;
4550import org .springframework .dao .InvalidDataAccessApiUsageException ;
51+ import org .springframework .data .core .MemberDescriptor .KPropertyReferenceDescriptor ;
4652import org .springframework .util .ClassUtils ;
4753import org .springframework .util .ObjectUtils ;
4854import org .springframework .util .StringUtils ;
@@ -104,8 +110,8 @@ class SerializableLambdaReader {
104110 public static final String INCLUDE_SUPPRESSED_EXCEPTIONS = "spring.data.lambda-reader.include-suppressed-exceptions" ;
105111
106112 private static final Log LOGGER = LogFactory .getLog (SerializableLambdaReader .class );
107- private static final boolean filterStackTrace = isEnabled (FILTER_STACK_TRACE , true );
108- private static final boolean includeSuppressedExceptions = isEnabled (INCLUDE_SUPPRESSED_EXCEPTIONS , false );
113+ private static final boolean filterStackTrace = isEnabled (FILTER_STACK_TRACE , false );
114+ private static final boolean includeSuppressedExceptions = isEnabled (INCLUDE_SUPPRESSED_EXCEPTIONS , true );
109115
110116 private final List <Class <?>> entryPoints ;
111117
@@ -132,6 +138,18 @@ private static boolean isEnabled(String property, boolean defaultValue) {
132138 public MemberDescriptor read (Object lambdaObject ) {
133139
134140 SerializedLambda lambda = serialize (lambdaObject );
141+
142+ if (isKotlinPropertyReference (lambda )) {
143+
144+ Object captured = lambda .getCapturedArg (0 );
145+ if (captured != null //
146+ && captured instanceof PropertyReference propRef //
147+ && propRef .getOwner () instanceof KClass <?> owner //
148+ && captured instanceof KProperty1 <?, ?> kProperty ) {
149+ return new KPropertyReferenceDescriptor (JvmClassMappingKt .getJavaClass (owner ), kProperty );
150+ }
151+ }
152+
135153 assertNotConstructor (lambda );
136154
137155 try {
@@ -156,6 +174,11 @@ public MemberDescriptor read(Object lambdaObject) {
156174 + ". The given value is not a lambda or method reference." );
157175 }
158176
177+ public static boolean isKotlinPropertyReference (SerializedLambda lambda ) {
178+ return KotlinDetector .isKotlinReflectPresent () && lambda .getCapturedArgCount () == 1
179+ && lambda .getCapturedArg (0 ) != null && KotlinDetector .isKotlinType (lambda .getCapturedArg (0 ).getClass ());
180+ }
181+
159182 private void assertNotConstructor (SerializedLambda lambda ) {
160183
161184 if (lambda .getImplMethodKind () == MethodHandleInfo .REF_newInvokeSpecial
@@ -192,7 +215,7 @@ private MemberDescriptor getMemberDescriptor(Object lambdaObject, SerializedLamb
192215 }
193216 }
194217
195- private static SerializedLambda serialize (Object lambda ) {
218+ static SerializedLambda serialize (Object lambda ) {
196219
197220 try {
198221 Method method = lambda .getClass ().getDeclaredMethod ("writeReplace" );
0 commit comments