Hi all, I've been getting an interesting error when my app runs for an extended period of time: ```...
t

Tasos Stamadianos

almost 7 years ago
Hi all, I've been getting an interesting error when my app runs for an extended period of time:
17:10:33.977 [main] ERROR bees.stream.MessageStream - [MessageStream.kt:42] || - Message deserialization failed.
kotlin.reflect.full.IllegalCallableAccessException: java.lang.IllegalAccessException: class kotlin.reflect.jvm.internal.calls.CallerImpl$Constructor cannot access a member of class bees.stream.MessageStream$SystemMessage with modifiers "public"
        at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:224)
        at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflect_api(KCallableImpl.kt:152)
        at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:110)
        at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapter.fromJson(KotlinJsonAdapter.kt:104)
        at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:137)
        at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:41)
        at bees.stream.MessageStream.onMessages(MessageStream.kt:39)
        at bees.stream.kafka.KafkaConsumerProducerStream.start(KafkaProducerConsumerStream.kt:64)
        at bees.BeesKt.main(bees.kt:65)
Caused by: java.lang.IllegalAccessException: class kotlin.reflect.jvm.internal.calls.CallerImpl$Constructor cannot access a member of class bees.stream.MessageStream$SystemMessage with modifiers "public"
        at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
        at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
        at kotlin.reflect.jvm.internal.calls.CallerImpl$Constructor.call(CallerImpl.kt:41)
        at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:106)
        ... 8 common frames omitted
17:10:33.989 [main] DEBUG bees.stream.MessageStream - [MessageStream.kt:83] || - Completed message processing. Returning 0 responses.
I have a Moshi instance whose job it is to do this deserialization. The class it wants to create is:
private data class SystemMessage(val command: String, val sessionId: UUID, val commandId: UUID, val data: Any)
. This is private to the class within the module. This only happens when the app is running for longer periods, if I restart and try again it works fine. When I search "java cannot access a member of a class with modifiers public", I get results which indicate that the class cannot be instantiated since it's private to its enclosing class. However, this doesn't explain why it works for some time if I restart the app. I've tried with JVM 8 and JVM 11, same error on both. This was built with Kotlin 1.3.10, but I'm going to try 1.3.20 now. Any help would be greatly appreciated 🙂