Kotlin/포스팅

코틀린 리플렉션 API

짜집퍼박사(짜박) 2024. 1. 3. 00:00

코틀린 리플렉션 API는 kotlin-reflect 라이브러리를 통해 제공됩니다. 이 라이브러리를 사용하여 실행 중인 코드의 구조를 분석하고 조작할 수 있습니다. 주요한 클래스와 함수들을 살펴보면서 리플렉션 API를 자세히 살펴보겠습니다.

 

1. KClass

KClass는 클래스와 관련된 리플렉션 정보를 제공하는 핵심 인터페이스입니다. ::class를 사용하여 클래스의 KClass 인스턴스를 얻을 수 있습니다.

data class Person(val name: String, val age: Int)

fun main() {
    val kClass: KClass<Person> = Person::class
    println("Class Name: ${kClass.simpleName}")
}

 

2. KFunction 및 KProperty

KFunction은 함수와 관련된 리플렉션 정보를 제공하고, KProperty는 프로퍼티와 관련된 정보를 제공합니다.

data class Person(val name: String, val age: Int)

fun main() {
    val kClass: KClass<Person> = Person::class
    val functions: Collection<KFunction<*>> = kClass.memberFunctions
    val properties: Collection<KProperty<*>> = kClass.memberProperties

    for (function in functions) {
        println("Function Name: ${function.name}")
    }

    for (property in properties) {
        println("Property Name: ${property.name}")
    }
}

 

3. KParameter

KParameter는 함수의 파라미터와 관련된 리플렉션 정보를 제공합니다.

data class Person(val name: String, val age: Int)

fun main() {
    val kClass: KClass<Person> = Person::class
    val constructor = kClass.primaryConstructor
    val parameters: List<KParameter> = constructor?.parameters ?: emptyList()

    for (parameter in parameters) {
        println("Parameter Name: ${parameter.name}")
    }
}

 

4. call 메서드

call 메서드는 함수를 호출하고, get 및 set 메서드는 프로퍼티의 값을 가져오거나 설정합니다.

data class Person(val name: String, val age: Int)

fun main() {
    val person = Person("Alice", 30)
    val kClass: KClass<Person> = Person::class

    val function: KFunction<Int> = kClass.memberFunctions.first { it.name == "calculateAgeInMonths" } as KFunction<Int>
    val result = function.call(person) // 함수 호출
    println("Result: $result")

    val property: KProperty<String> = kClass.memberProperties.first { it.name == "name" } as KProperty<String>
    val value = property.get(person) // 프로퍼티 값 가져오기
    println("Property Value: $value")

    property.set(person, "Bob") // 프로퍼티 값 설정
    println("Modified Person: $person")
}

 

5. 애너테이션 조회

annotations 프로퍼티를 사용하여 클래스에 적용된 애너테이션을 조회할 수 있습니다.

annotation class MyAnnotation(val value: String)

@MyAnnotation("Hello, Annotation!")
class MyClass

fun main() {
    val kClass: KClass<MyClass> = MyClass::class
    val annotations: List<Annotation> = kClass.annotations

    for (annotation in annotations) {
        if (annotation is MyAnnotation) {
            println("Annotation Value: ${annotation.value}")
        }
    }
}

위의 코드에서 annotations 프로퍼티를 사용하여 MyAnnotation 애너테이션을 조회하고 그 값을 출력합니다.

이러한 클래스와 함수 등의 리플렉션 정보를 사용하여 실행 중인 코드를 분석하고 동적으로 다양한 작업을 수행할 수 있습니다. 그러나 리플렉션은 성능에 영향을 미칠 수 있으며, 코드가 런타임에 안전하지 않게 될 수 있기 때문에 사용 시에 주의가 필요합니다. 가능한 경우 리플렉션 없이 해결할 수 있는 방법을 찾는 것이 좋습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 리플렉션 호출 가능  (0) 2024.01.03
코틀린 리플렉션 지정자와 타입  (0) 2024.01.03
코틀린 리플렉션  (0) 2024.01.02
코틀린 내장 애너테이션  (0) 2024.01.02
코틀린 애너테이션 클래스 정의  (0) 2024.01.02