diff --git a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt index 311d14e..b09da8f 100644 --- a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt +++ b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapterTest.kt @@ -952,4 +952,16 @@ class KotlinJsonAdapterTest { assertThat(adapter.fromJson("null")).isNull() assertThat(adapter.toJson(null)).isEqualTo("null") } + + @Test fun kotlinClassesWithoutAdapterAreRefused() { + val moshi = Moshi.Builder().build() + try { + moshi.adapter(PlainKotlinClass::class.java) + fail("Should not pass here") + } catch (e: IllegalArgumentException) { + assertThat(e).hasMessageContaining("Reflective serialization of Kotlin classes") + } + } + + class PlainKotlinClass } diff --git a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java index 71d4534..b8491b7 100644 --- a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java +++ b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java @@ -75,6 +75,14 @@ final class ClassJsonAdapter extends JsonAdapter { if (Modifier.isAbstract(rawType.getModifiers())) { throw new IllegalArgumentException("Cannot serialize abstract class " + rawType.getName()); } + for (Annotation annotation : rawType.getDeclaredAnnotations()) { + if ("kotlin.Metadata".equals(annotation.annotationType().getName())) { + throw new IllegalArgumentException("Cannot serialize Kotlin type " + rawType.getName() + + ". Reflective serialization of Kotlin classes without using kotlin-reflect has " + + "undefined and unexpected behavior. Please use KotlinJsonAdapter from the " + + "moshi-kotlin artifact or use code gen from the moshi-kotlin-codegen artifact."); + } + } ClassFactory classFactory = ClassFactory.get(rawType); Map> fields = new TreeMap<>();