import kotlin.reflect.full.findAnnotation
annotation class TA1
// 애노테이션에 메타 에노테이션(속성)이 적용된 경우 @Target(AnnotationTarget.CLASS) annotation class TA2
// 애노테이션 클래스에 읽기 전용 프로퍼티를 추가한 경우 annotation class TA3 ( val desc: String )
// 클래스, 멤버 함수 등에 애노테이션을 적용한 경우 @TA2 class Test { @TA1 fun func1 () { println("Test::func1()") }
/* 에러: TA2는 AnnotationTarget.CLASS로 지정되어 있으므로 class에만 적용 가능한 annotation입니다. @TA2 fun func2 () { println("Test::func2()") } */
// 애노테이션을 적용하면서 각각의 인스턴스에 각각 다른 데이터를 설정하는 경우 @TA3("Test::func3...TA3 테스트용 함수") fun func3 () { println("Test::func3()") }
// 하나의 대상(여기서는 함수)에 여러개의 애노테이션이 적용된 경우 @TA1 @TA3("Test::func4...TA4 테스트용 함수") fun func4 () { println("Test::func4()") }
}
//fun main (args: Array<String> ) { fun test () { var obj1 = Test() obj1.func1()
// 개발자가 애노테이션 정보를 리플렉션을 이용해 주 소스 코드에서 이용하는 경우 var obj2 = Test() var obj2_K_func3 = obj2::func3 println(obj2_K_func3.annotations)
var obj2_K_func4 = obj2::func4 var bAnno2 = obj2_K_func4.findAnnotation<TA2>() println(bAnno2) var anno3: TA3? = obj2_K_func4.findAnnotation<TA3>() println(anno3) println(anno3?.desc) println(obj2_K_func4.annotations) } |