From f94592730efec4245b0c1dbeb0219aab98e0f67d Mon Sep 17 00:00:00 2001 From: xihan123 Date: Sun, 8 Mar 2026 03:18:57 +0800 Subject: [PATCH 1/2] fix: Lambda creation failed, fallback to parent's reflection implementation, for issue #4011 --- .../PropertyAccessorFactoryLambda.java | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java b/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java index b1b651055e..a6d9036c94 100644 --- a/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java +++ b/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java @@ -268,46 +268,50 @@ public PropertyAccessor create( boolean lambda = declaringClass.getName().contains("$$Lambda"); if (!lambda && (setter == null || !isChainableSetter(setter))) { - if (propertyClass == boolean.class) { - return create(name, getBoolean(getter), setBoolean(setter)); - } - if (JDKUtils.JVM_VERSION == 8) { - if (propertyClass == byte.class) { - return create(name, getByte(getter), setByte(setter)); + try { + if (propertyClass == boolean.class) { + return create(name, getBoolean(getter), setBoolean(setter)); } - if (propertyClass == short.class) { - return create(name, getShort(getter), setShort(setter)); + if (JDKUtils.JVM_VERSION == 8) { + if (propertyClass == byte.class) { + return create(name, getByte(getter), setByte(setter)); + } + if (propertyClass == short.class) { + return create(name, getShort(getter), setShort(setter)); + } + if (propertyClass == char.class) { + return create(name, getChar(getter), setChar(setter)); + } } - if (propertyClass == char.class) { - return create(name, getChar(getter), setChar(setter)); + if (propertyClass == int.class) { + return create(name, getInt(getter), setInt(setter)); } - } - if (propertyClass == int.class) { - return create(name, getInt(getter), setInt(setter)); - } - if (propertyClass == long.class) { - return create(name, getLong(getter), setLong(setter)); - } - if (propertyClass == float.class) { - return create(name, getFloat(getter), setFloat(setter)); - } - if (propertyClass == double.class) { - return create(name, getDouble(getter), setDouble(setter)); - } - if (!propertyClass.isPrimitive()) { - if (propertyType == null) { - if (getter != null) { - propertyType = getter.getGenericReturnType(); - } else { - Type[] parameterTypes = setter.getGenericParameterTypes(); - if (parameterTypes.length == 1) { - propertyType = parameterTypes[0]; - } else if (parameterTypes.length == 2 && String.class.equals(parameterTypes[0])) { - propertyType = parameterTypes[1]; + if (propertyClass == long.class) { + return create(name, getLong(getter), setLong(setter)); + } + if (propertyClass == float.class) { + return create(name, getFloat(getter), setFloat(setter)); + } + if (propertyClass == double.class) { + return create(name, getDouble(getter), setDouble(setter)); + } + if (!propertyClass.isPrimitive()) { + if (propertyType == null) { + if (getter != null) { + propertyType = getter.getGenericReturnType(); + } else { + Type[] parameterTypes = setter.getGenericParameterTypes(); + if (parameterTypes.length == 1) { + propertyType = parameterTypes[0]; + } else if (parameterTypes.length == 2 && String.class.equals(parameterTypes[0])) { + propertyType = parameterTypes[1]; + } } } + return create(name, propertyClass, propertyType, getObject(getter), setObject(name, setter), exceptionHandler); } - return create(name, propertyClass, propertyType, getObject(getter), setObject(name, setter), exceptionHandler); + } catch (Throwable ignored) { + // Lambda creation failed, fallback to parent's reflection implementation } } From 3518bb73466369acee5da34c4001c09630de1e13 Mon Sep 17 00:00:00 2001 From: xihan123 Date: Sat, 25 Apr 2026 17:18:18 +0800 Subject: [PATCH 2/2] fix: Address the issue of exception handling when the Lambda property accessor creation fails --- .../fastjson2/introspect/PropertyAccessorFactoryLambda.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java b/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java index a6d9036c94..c28b7e91fb 100644 --- a/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java +++ b/core/src/main/java/com/alibaba/fastjson2/introspect/PropertyAccessorFactoryLambda.java @@ -311,6 +311,9 @@ public PropertyAccessor create( return create(name, propertyClass, propertyType, getObject(getter), setObject(name, setter), exceptionHandler); } } catch (Throwable ignored) { + if (ignored instanceof IllegalArgumentException) { + throw (IllegalArgumentException) ignored; + } // Lambda creation failed, fallback to parent's reflection implementation } }