코틀린 리플렉션 API에서는 클래스, 함수, 프로퍼티, 파라미터 등의 리플렉션 정보를 가져오거나 조작하기 위한 여러 지정자와 타입이 제공됩니다.
1. 리플렉션 지정자 (KVisibility)
KVisibility는 클래스, 함수, 프로퍼티 등의 접근 제어 지정자를 나타내는 열거형입니다.
data class Person(private val name: String, protected val age: Int)
fun main() {
val kClass = Person::class
val properties = kClass.memberProperties
for (property in properties) {
println("${property.name} visibility: ${property.visibility}")
}
}
위의 코드에서 visibility 프로퍼티를 통해 각 프로퍼티의 접근 제어 지정자를 확인할 수 있습니다.
2. 리플렉션 타입 (KType)
KType은 타입 정보를 나타내는 인터페이스로, 클래스, 제네릭 타입, 함수 등에 대한 정보를 제공합니다.
data class Box<T>(val value: T)
fun main() {
val kClass = Box::class
val genericType = kClass.typeParameters.first()
println("Generic Type Name: ${genericType.name}")
println("Generic Type Variance: ${genericType.variance}")
}
위의 코드에서 typeParameters를 통해 클래스의 제네릭 타입 정보를 얻고, 각 타입의 이름과 변성(Variance)을 확인할 수 있습니다.
3. 리플렉션 파라미터 (KParameter)
KParameter는 함수나 생성자의 파라미터에 대한 정보를 나타내는 인터페이스입니다.
data class Person(val name: String, val age: Int)
fun main() {
val kClass = Person::class
val constructor = kClass.primaryConstructor
val parameters = constructor?.parameters ?: emptyList()
for (parameter in parameters) {
println("Parameter Name: ${parameter.name}")
println("Parameter Type: ${parameter.type}")
}
}
위의 코드에서 parameters를 통해 생성자의 파라미터 정보를 얻고, 각 파라미터의 이름과 타입을 확인할 수 있습니다.
4. 타입 변환 및 캐스팅
리플렉션을 통해 얻은 KClass, KType, KParameter 등의 객체는 일반적인 타입으로 변환할 수 있습니다.
data class Person(val name: String, val age: Int)
fun main() {
val kClass: KClass<Person> = Person::class
val regularClass: Class<Person> = kClass.java
val kType: KType = kClass.starProjectedType
val regularType: Type = kType.javaType
val kParameter: KParameter = kClass.primaryConstructor!!.parameters.first()
val regularParameter: Parameter = kParameter.javaParameter
}
위의 코드에서 java 프로퍼티를 사용하여 리플렉션 객체를 일반적인 자바 타입으로 변환할 수 있습니다.
리플렉션을 사용할 때는 적절한 예외 처리와 안전한 캐스팅을 고려해야 합니다. 또한, 리플렉션은 성능에 영향을 미치므로 신중하게 사용해야 합니다. 가능하면 리플렉션 없이 코드를 작성하는 것이 권장됩니다.
With ChatGPT
'Kotlin > 포스팅' 카테고리의 다른 글
코틀린 연산자 오버로딩 (0) | 2024.01.03 |
---|---|
코틀린 리플렉션 호출 가능 (0) | 2024.01.03 |
코틀린 리플렉션 API (0) | 2024.01.03 |
코틀린 리플렉션 (0) | 2024.01.02 |
코틀린 내장 애너테이션 (0) | 2024.01.02 |