diff --git a/moshi/records-tests/src/test/java/com/squareup/moshi/records/RecordsTest.java b/moshi/records-tests/src/test/java/com/squareup/moshi/records/RecordsTest.java index 00f613f0d..c31cc5875 100644 --- a/moshi/records-tests/src/test/java/com/squareup/moshi/records/RecordsTest.java +++ b/moshi/records-tests/src/test/java/com/squareup/moshi/records/RecordsTest.java @@ -290,5 +290,16 @@ public void nullObjectIsNull() throws IOException { assertThat(adapter.toJson(value)).isEqualTo("{\"i\":5}"); } + @Test + public void privateRecordSerializesCorrectly() throws IOException { + var adapter = moshi.adapter(PrivateRecord.class); + String json = "{\"id\":\"1\",\"value\":123}"; + PrivateRecord privateRecord = new PrivateRecord("1", 123); + assertThat(adapter.fromJson(json)).isEqualTo(privateRecord); + assertThat(adapter.toJson(privateRecord)).isEqualTo(json); + } + + private record PrivateRecord(String id, int value) {} + public record AbsentValues(String s, int i) {} } diff --git a/moshi/src/main/java16/com/squareup/moshi/internal/RecordJsonAdapter.kt b/moshi/src/main/java16/com/squareup/moshi/internal/RecordJsonAdapter.kt index 157466c67..f19911d97 100644 --- a/moshi/src/main/java16/com/squareup/moshi/internal/RecordJsonAdapter.kt +++ b/moshi/src/main/java16/com/squareup/moshi/internal/RecordJsonAdapter.kt @@ -128,7 +128,12 @@ internal class RecordJsonAdapter( val components = rawType.recordComponents val bindings = LinkedHashMap>() - val lookup = MethodHandles.lookup() + var lookup = MethodHandles.lookup() + try { + lookup = MethodHandles.privateLookupIn(rawType, lookup) + } catch (_: IllegalAccessException) { + // fallback to standard lookup + } val componentRawTypes = Array>(components.size) { i -> val component = components[i]