[kotlin] 코틀린 리플렉션을 이용한 익명 내부 클래스 접근

일반적으로, 코틀린에서 익명 내부 클래스에 직접적인 접근은 불가능합니다. 하지만 리플렉션(Reflection) 을 사용하여 간접적으로 접근할 수 있습니다.

예를 들어, 다음과 같이 코틀린에서 정의된 내부 클래스를 갖는 외부 클래스가 있다고 합시다.

class Outer {
    inner class Inner {
        fun innerFunction() {
            println("Inner function called")
        }
    }
}

이때, 익명 내부 클래스를 다음과 같이 생성할 수 있습니다.

fun main() {
    val outer = Outer()

    val inner = object : outer.Inner() {}
    inner.innerFunction()
}

이제 outer 인스턴스를 통해 inner 익명 내부 클래스에 직접 접근할 수는 없지만, 리플렉션을 사용하여 간접적으로 접근할 수 있습니다.

다음은 리플렉션을 사용하여 익명 내부 클래스의 인스턴스를 생성하고 메소드를 호출하는 코드입니다.

import kotlin.reflect.full.createInstance
import kotlin.reflect.full.declaredMemberFunctions

fun main() {
    val outer = Outer()

    val innerClass = outer::class.java.getDeclaredClasses().first { it.simpleName == "Inner" }
    val constructor = innerClass.declaredConstructors.first()

    constructor.isAccessible = true
    val inner = constructor.newInstance(outer) as Outer.Inner

    val innerFunction = Inner::class.declaredMemberFunctions.first { it.name == "innerFunction" }
    innerFunction.isAccessible = true
    innerFunction.call(inner)
}

위의 예제에서, outer 인스턴스의 클래스를 통해 내부 클래스 Inner에 대한 정보를 가져오고, 해당 클래스의 생성자를 통해 새로운 인스턴스를 생성한 뒤에, 리플렉션을 사용하여 메소드를 호출하고 있습니다.

리플렉션은 강력하지만, 실행 시점에 오버헤드가 발생할 수 있으므로 신중하게 사용해야 합니다.

참고 자료