Hey all, I’m running into an issue regarding an “IllegalAccessError” exception at runtime when invoking inline reified-type lambdas that access a protected member of the class the original declaration is in. For example, take the following abstract class:
package com.example
abstract class A {
protected val hello: String = "hello"
protected inline fun <reified T> helloType(): () -> Unit = {
println("$hello ${T::class.java}")
}
}
And the following class that inherits from A:
package com.example2
class B: A() {
val result = helloType<String>()
}
When I invoke the lambda like:
fun main(args: Array<String>) {
B().result()
}
Then I get the IllegalAccessError:
Exception in thread "main" java.lang.IllegalAccessError: tried to access method example.A.getHello()Ljava/lang/String; from class B$$special$$inlined$helloType$1
However, if I take out the reified T type parameter like:
abstract class A {
protected val hello: String = "hello"
protected inline fun helloType(): () -> Unit = {
println(hello)
}
}
It will work. The function doesn’t need to be marked as inline anymore, either, but it will just compile with a warning. If I remove the inline it also works as well.
Also, I can remove the protected visibility modifier of A.hello but I would prefer to keep it protected, if possible.
This is a simplified example, of course, as in my use case I actually do need the reified T so I can access the class of T via T::class.java but I’m just confused as to why the reified T seems to cause this issue. Is this intended or is there a work-around/proper way of doing it that I am missing?
Thanks!