코틀린 리플렉션은 실행 중인 코드의 구조를 분석하고 조작하는 데 사용되는 기술입니다. 리플렉션을 사용하면 클래스, 메서드, 프로퍼티 등에 대한 정보를 동적으로 가져오거나 수정할 수 있습니다. 코틀린 리플렉션은 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 |