[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
에 대한 정보를 가져오고, 해당 클래스의 생성자를 통해 새로운 인스턴스를 생성한 뒤에, 리플렉션을 사용하여 메소드를 호출하고 있습니다.
리플렉션은 강력하지만, 실행 시점에 오버헤드가 발생할 수 있으므로 신중하게 사용해야 합니다.
참고 자료