Kotlin/포스팅

코틀린 리플렉션

짜집퍼박사(짜박) 2024. 1. 2. 23:56

코틀린 리플렉션은 실행 중인 코드의 구조를 분석하고 조작하는 데 사용되는 기술입니다. 리플렉션을 사용하면 클래스, 메서드, 프로퍼티 등에 대한 정보를 동적으로 가져오거나 수정할 수 있습니다. 코틀린 리플렉션은 kotlin-reflect 라이브러리를 통해 제공됩니다.

 

1. 클래스 정보 가져오기

import kotlin.reflect.full.*

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

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

    println("Class Name: ${kClass.simpleName}")
    println("Properties: ${kClass.memberProperties.map { it.name }}")
    println("Functions: ${kClass.memberFunctions.map { it.name }}")
}

 

2. 인스턴스 생성하기

import kotlin.reflect.full.createInstance

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

fun main() {
    val kClass = Person::class
    val person = kClass.createInstance()
    println(person) // 출력: Person(name='', age=0)
}

 

3. 프로퍼티 값 가져오기 및 설정하기

import kotlin.reflect.full.*

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

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

    kClass.memberProperties.forEach {
        println("${it.name}: ${it.get(person)}")
    }

    val modifiedPerson = kClass.createInstance().apply {
        kClass.memberProperties.forEach {
            if (it.name == "name") {
                it.setter.call(this, "Bob")
            }
            if (it.name == "age") {
                it.setter.call(this, 25)
            }
        }
    }

    println(modifiedPerson) // 출력: Person(name='Bob', age=25)
}

 

4. 메서드 호출하기

import kotlin.reflect.full.*

class Calculator {
    fun add(a: Int, b: Int): Int {
        return a + b
    }

    fun multiply(a: Int, b: Int): Int {
        return a * b
    }
}

fun main() {
    val calculator = Calculator()
    val kClass = calculator::class

    val addMethod = kClass.memberFunctions.first { it.name == "add" }
    val result = addMethod.call(calculator, 10, 5)
    println(result) // 출력: 15
}

 

5. 리플렉션을 사용한 애너테이션 조회

annotation class MyAnnotation(val value: String)

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

fun main() {
    val kClass = MyClass::class
    val annotation = kClass.annotations.firstOrNull { it is MyAnnotation } as? MyAnnotation
    println(annotation?.value) // 출력: Hello, Annotation!
}

리플렉션은 일반적으로 성능이 떨어지고 컴파일 타임에 안전하지 않은 코드를 생성할 수 있기 때문에 신중하게 사용해야 합니다. 가능한 경우 리플렉션 없이 해결할 수 있는 방법을 찾는 것이 좋습니다.

 

With ChatGPT

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

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