diff --git a/src/main/java/com/fasterxml/jackson/databind/ext/KotlinSupport.java b/src/main/java/com/fasterxml/jackson/databind/ext/KotlinSupport.java new file mode 100644 index 0000000000..c4349e51a1 --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/databind/ext/KotlinSupport.java @@ -0,0 +1,23 @@ +package com.fasterxml.jackson.databind.ext; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +public class KotlinSupport { + public static boolean isJvmInlineClassSyntheticConstructor(Constructor ctor) { + Class[] params = ctor.getParameterTypes(); + if (params.length == 0) { + return false; + } + + Class lastParam = params[params.length - 1]; + return ctor.isSynthetic() && lastParam.getName().equals("kotlin.jvm.internal.DefaultConstructorMarker"); + } + + public static boolean isJvmInlineClassSyntheticBoxingFunction(Method method) { + return Modifier.isStatic(method.getModifiers()) + && method.isSynthetic() + && method.getName().equals("box-impl"); + } +} diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/AnnotatedCreatorCollector.java b/src/main/java/com/fasterxml/jackson/databind/introspect/AnnotatedCreatorCollector.java index 96741181af..25a0b9ff70 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/AnnotatedCreatorCollector.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/AnnotatedCreatorCollector.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.AnnotationIntrospector; import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ext.KotlinSupport; import com.fasterxml.jackson.databind.introspect.AnnotatedClass.Creators; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.databind.util.ClassUtil; @@ -282,7 +283,9 @@ private static boolean _isIncludableFactoryMethod(Method m) } // 09-Nov-2020, ckozak: Avoid considering synthetic methods such as // lambdas used within methods because they're not relevant. - return !m.isSynthetic(); + return !m.isSynthetic() + // 02-Sep-2023: As per [databind#4066] Kotlin needs some synthetic factory methods + || KotlinSupport.isJvmInlineClassSyntheticBoxingFunction(m); } protected AnnotatedConstructor constructDefaultConstructor(ClassUtil.Ctor ctor, @@ -406,8 +409,10 @@ private final AnnotationMap collectAnnotations(AnnotatedElement main, AnnotatedE return c.asAnnotationMap(); } - // for [databind#1005]: do not use or expose synthetic constructors private static boolean isIncludableConstructor(Constructor c) { - return !c.isSynthetic(); + // for [databind#1005]: do not use or expose synthetic constructors + return !c.isSynthetic() + // 02-Sep-2023: As per [databind#4066] Kotlin needs some synthetic constructors + || KotlinSupport.isJvmInlineClassSyntheticConstructor(c); } }