@annotaionName
/*선언부*/
함수, 클래스 등 여러 코드 구성 요소에 어노테이션 적용 가능
JUnit 프레임워크와 kotlin.test를 사용한다면 테스트 메서드 앞에 “@test”를 붙일 수 있음
import kotlin.test.*
class MyTest{
@test // 어놑이션을 통해 JUnit 프레임워크에 이 메서드를 테스트로 호출하라고 지시
fun testTrue() {
assertTrue(1 + 1 == 2)
}
}
@Target(allowedTargets = [AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS])
annotation class Deprecated(
val message: String,
val replaceWith: ReplaceWith = ReplaceWith(""),
val level: DeprecationLevel = DeprecationLevel.WARNING
)@Deprecated ("Use RemoveAt(index) instead.", ReplaceWith("removeAt(index)"))
fun remove(index: Int) { /*...*/ }
const val TEST_TIMEOUT = 10L
class MyTest {
@Test
@Timeout(TEST_TIMEOUT)
fun testMethod() {
//...
}
}
@target:AnnotationName
@get:JvmName("obtainCertificate")
@set:JvmName("putCertificate")
// 안전하지 못한 캐스팅 경고 무시하는 로컬 변수 선언
fun test(list: List<*>) {
@Suppress("UNCHECKED_CAST")
val strings = list as List<String>
}
data class Person(val name: String, val age: Int)
fun main() {
val person = Person("Alice", 29)
// 직렬화
println(serialize(person))
// {"age" : 29, "name" : "Alice"}
// 역직렬화
val json = """{"name" : "Alice", "age" : 29}"""
println(deserialize<Person>(json)) // Json 객체의 타입 정보를 명시해줘야 함
// Person(name=Alice, age=29)
}
data class Person(
@JsonName("alias") val firstName: String,
@JsonExclude val age: Int? = null
)
내부에 아무 코드도 들어있을 수 없음
@JsonExclude 예시
annotation class JsonExclude
일반적인 주 생성자 구문을 사용하면서 val로 선언
@JsonName 예시
annotation class JsonName(val name: String)
public @interface JsonName {
String value();
}
어노테이션 클래스에도 어노테이션을 붙일 수 있음
어노테이션 클래스에 적용할 수 있는 어노테이션 → 메타어노테이션
메타어노테이션은 컴파일러가 어노테이션을 처리하는 방법을 제어함
@Target 메타어노테이션
어노테이션을 적용할 수 있는 요소의 유형을 지정
@Target을 지정하지 않으면 모든 선언에 적용할 수 있는 어노테이션이 됨
@Target(AnnotationTarget.PROPERTY)
annotation class JsonExclude
AnnotationTarget → 어노테이션 적용 가능한 타깃이 정의된 이넘
@Target(AnnotationTarget.CLASS,
AnnotationTarget.FUNCTION,
AnnotationTarget.TYPE_PARAMETER,
AnnotationTarget.VALUE_PARAMETER,
AnnotationTarget.EXPRESSION)
메타어노테이션을 직접 만들 수 있음
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class BindingAnnotation
@BindingAnnotation
annotation class MyBinding
대상을 PROPERTY로 지정한 어노테이션 → 자바에서 사용할 수 없음
interface Company {
val name: String
}
data class CompanyImpl(override val name: String) : Company
data class Person(
val name: String,
@DeserializeInterface(CompanyImpl::class) val company: Company
)
annotation class DesirializeInterface(val targetClass: KClasee<out Any>)
jkid → 기본 타입이 아닌 프로퍼티를 내포된 객체로 직렬화 함
이런 기본 동작을 변경하려면 직렬화하는 로직을 직접 제공하면 됨
@CustomSerializer
ValueSerializer 인터페이스를 구현한 클래스
직렬화, 역직렬화 제공
interface ValueSerializer<T> {
fun toJsonValue(value: T) : Any?
fun fromJsonValue(jsonValue: Any?): T
}
data class Person(
val name: String,
@CustomSerializer(DateSerializer::class) val birthDate: Date
)annotation class CustomSerializer(
val serializerClass: KClass<out ValueSerializer<*>>
)어떤 파라미터가 쓰일지 알 수 없음 → 스타프로젝션 사용
