Reflection - boostcampwm-2024/and04-Nature-Album GitHub Wiki

Kotlinμ—μ„œ λ¦¬ν”Œλ ‰μ…˜(Reflection)

  • ν”„λ‘œκ·Έλž¨μ΄ λŸ°νƒ€μž„μ— μžμ‹ μ˜ ꡬ쑰λ₯Ό μ‘°μ‚¬ν•˜κ³  μ‘°μž‘ν•  수 μžˆλŠ” κΈ°λŠ₯을 의미
  • μ½”λ“œ μ‹€ν–‰ 쀑에 클래슀, ν•¨μˆ˜, ν”„λ‘œνΌν‹° λ“±μ˜ 메타데이터에 μ ‘κ·Όν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆλ‹€.
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("클래슀 이름: ${kClass.simpleName}")

    // λͺ¨λ“  ν”„λ‘œνΌν‹° 정보 좜λ ₯
    kClass.memberProperties.forEach { property ->
        println("ν”„λ‘œνΌν‹° 이름: ${property.name}, νƒ€μž…: ${property.returnType}")
    }

    // νŠΉμ • ν”„λ‘œνΌν‹° κ°’ κ°€μ Έμ˜€κΈ°
    val nameProperty = kClass.memberProperties.find { it.name == "name" }
    println("이름: ${nameProperty?.get(person)}")
}

  • μœ„μ²˜λŸΌ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑에 μžμ‹ μ˜ ꡬ쑰λ₯Ό κ²€μ‚¬ν•˜κ³  μˆ˜μ •ν•  수 μžˆλŠ” 것
  • 이λ₯Ό 톡해 클래슀, λ©”μ„œλ“œ, ν•„λ“œ λ“±μ˜ 정보λ₯Ό λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ μ‘°νšŒν•˜κ±°λ‚˜ μ‘°μž‘ κ°€λŠ₯
  • ν”„λ ˆμž„μ›Œν¬λ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 동적 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 데 유용
  • λŸ°νƒ€μž„μ— 객체λ₯Ό μƒμ„±ν•˜κ³  μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” λ“±

λ¦¬ν”Œλ ‰μ…˜μœΌλ‘œ 동적 객체 생성

  • 클래슀 μ΄λ¦„μ΄λ‚˜ νƒ€μž… 정보λ₯Ό λ¬Έμžμ—΄λ‘œ λ°›μ•„ λŸ°νƒ€μž„μ— ν•΄λ‹Ή 클래슀λ₯Ό λ‘œλ“œν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 것

    import kotlin.reflect.full.createInstance
    
    fun main() {
        val className = "com.example.MyClass"
        val kClass = Class.forName(className).kotlin
        val instance = kClass.createInstance()
        println("Created instance: $instance")
    }
    
    
    • β–² 클래슀 이름을 λ¬Έμžμ—΄λ‘œ λ°›μ•„ ν•΄λ‹Ή 클래슀λ₯Ό λ‘œλ“œν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό 생성
    • λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 컴파일 μ‹œμ μ— ꡬ체적인 클래슀 νƒ€μž…μ„ μ•Œμ§€ λͺ»ν•΄λ„, λŸ°νƒ€μž„μ— ν•„μš”ν•œ 객체λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•˜κ³  μ‚¬μš© κ°€λŠ₯

https://kotlinlang.org/docs/reflection.html