코틀린 리플렉션 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 |