ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • kotlin) 어노테이션과 리플렉션
    kotlin 2024. 7. 24. 23:10

    코틀린의 어노테이션

    @Retention

    어노테이션이 저장되고 유지되는 방식을 제어

    • SOURCE : 어노테이션이 컴파일 때만 존재한다.
    • BINARY : 어노테이션이 런타임 때도 있지만, 리플렉션을 쓸 수 없다.
    • RUNTIME : 어노테이션이 런타임 때 존재하고, 리플레션을 쓸 수 있다.(기본값)
    @Retention(AnnotationRetention.RUNTIME)      //어노테이션이 저장되고 유지되는 방식을 제어
    annotation class Shape
    public class TestAnnotation {
    }

    @Tartget

    어노테이션이 어디에 붙일지 선택할 수 있다. 종류가 많다.

    @Target(AnnotationTarget.FIELD, AnnotationTarget.ANNOTATION_CLASS)  
    annotation class Shape
    public class TestAnnotation {
    }

    @KClass

    코드로 작성한  Class 의 정보들을 가지고있는 다른 클래스가 KClass

    annotation class Shape(
        val text : String,
        val number : Int,
        val clazz : KClass<*>
    )
    public class TestAnnotation {
    
    }
    
    fun main(){
        val clazz : KClass<TestAnnotation> = TestAnnotation::class
    }

    코틀린의 리플렉션

    package p17;
    
    import kotlin.jvm.internal.Reflection
    import kotlin.reflect.KClass
    import kotlin.reflect.KType
    import kotlin.reflect.cast
    
    class GoldFish(val name: String) {
        fun swim(){
    
        }
    }
    
    fun main(){
        //KClass 안에는 name 프로퍼티를 갖고있는 KProperty, swim 함수를 갖고있는 KFunction 이 존재
        val kClass : KClass<GoldFish> = GoldFish::class
    
        var ref = Reflection()
        val kClass2 : KClass<out Reflection> = ref::class
    
        //우선 이름으로 가져와서
        val KClass3 : KClass<out Any> = Class.forName("reflect.Reflection").kotlin      //패키지 이름에서 리플랙션
    
    
        //KType, 타입을 표현, Int?
        val kType : KType = GoldFish.class.createType()
    }
    
    
    fun catToGoldFish(obj:Any): GoldFish {
        //obj 를 GoldFish 로 cast 한다.
        return GoldFish::class.cast(obj)
    }

     

    댓글

Designed by Tistory.