이 기사에서는 주석을 사용자 정의하는 방법을 배웁니다.
커스텀 어노테이션을 직접 사용하는 방법을 주로 소개합니다.
참고로 지난 글에서 코틀린의 어노테이션 소개와 종류에 대해 알아보았습니다.
Kotlin-1@에서 일반적으로 사용되는 주석 Kotlin에서 일반적으로 사용되는 주석에 대해 알아보세요. 주석은 방해가 되지 않는 방식으로 코드에 메타데이터(추가 기능)를 추가하는 방법입니다. android-developer.
Kotlin의 주석 유형 Kotlin에서
리플렉션을 사용한 사용자 지정 주석
Kotlin에서 주석을 맞춤설정하는 방법에는 두 가지가 있습니다.
- 맞춤 반사
- 코드 생성을 사용하여 사용자 지정
먼저 반사가 무엇인지 간단히 설명하겠습니다.
리플렉션은 런타임에 프로그램 구조(객체, 함수, 속성)를 분석하는 기술입니다.
즉, 프로그램이 실행 중일 때 예제 및 기타 방법을 통해 개체의 내부 구조를 파악할 수 있습니다.
하지만 이렇게 매번 확인하기 때문에 애플리케이션 성능 저하로 이어집니다.
Kotlin에서 리플렉션을 사용하려면 KClass를 사용해야 합니다.
코틀린 반영이에 대한 정보는 여기에서 확인할 수 있습니다.
Android Kotlin Reflection의 기본 정의
Kotlin의 리플렉션은 런타임에 프로그램 클래스를 검사하는 기술입니다.
즉, 프로그램이 실행 중일 때 예제 및 기타 방법을 통해 개체의 내부 구조를 파악할 수 있습니다.
큰
android-developer.
Kotlin에서 KClass를 사용하려면 다음 라이브러리를 추가해야 합니다.
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
아래와 같이 Annotation을 지정하여 주석 클래스를 생성해 보겠습니다.
@Target(AnnotationTarget.PROPERTY)
annotation class StringConstraint(
val minLength: Int,
val maxLength: Int
)
위에 생성 문자열 제약 주석이 달린 클래스는 문자열 변수의 최소 및 최대 길이 정의 이것은 당신이 만든 주석 클래스입니다.
속성 값이 있는 사용자 지정 주석 데이터 클래스적용하다.
data class Data(
// set field value with custom annotation
@StringConstraint(10, 50)
val title: String,
@StringConstraint(100, 500)
val contents: String
)
이제 이 두 검사를 사용하여 유효성을 검사하는 코드를 작성합니다.
object FieldValidator {
data class ValidationResult(
var isValid: Boolean = true,
val invalidFieldNames: MutableList<String> = mutableListOf()
)
fun validate(data: Data): ValidationResult {
val result = ValidationResult()
// get property information with reflection
data::class.declaredMemberProperties.forEach {
val field = it
val annotation = it.findAnnotation<StringConstraint>()
if (annotation !
= null && field.getter.visibility == KVisibility.PUBLIC) {
val fieldValue = field.getter.call(data) as String
// set validation with annotation field value
if (fieldValue.length !
in annotation.minLength..annotation.maxLength) {
result.isValid = false
result.invalidFieldNames.add(field.name)
}
}
}
return result
}
}
그리고 다음 코드를 작성하고 실행합니다.
fun main() {
val data = Data(
"극도의 투명함",
"투명함은 단순히 결과가 잘 공유되는 것 이상을 의미합니다.
우리는 결과뿐 아니라 의도와 맥락, 과정까지도 알 수 있을 만큼 공유하는 것을 투명하다고 합니다.
우리가 추구하는 극도의 솔직함은 투명함이 전제되어야만 발현된다고 믿습니다.
"
)
val validationResult = FieldValidator.validate(data)
// Validation: false / not validated Field: (title)
println("Validation: ${validationResult.isValid} / not validated Field: ${validationResult.invalidFieldNames}")
}
정리하다
이렇게 커스텀 Annotation과 Kotlin Reflection을 사용하는 방법을 배웠습니다.
참고로 모든 코드는 다음과 같습니다.
import kotlin.reflect.KVisibility
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.full.findAnnotation
@Target(AnnotationTarget.PROPERTY)
annotation class StringConstraint(
val minLength: Int,
val maxLength: Int
)
data class Data(
// set field value with custom annotation
@StringConstraint(10, 50)
val title: String,
@StringConstraint(100, 500)
val contents: String
)
object FieldValidator {
data class ValidationResult(
var isValid: Boolean = true,
val invalidFieldNames: MutableList<String> = mutableListOf()
)
fun validate(data: Data): ValidationResult {
val result = ValidationResult()
// get property information with reflection
data::class.declaredMemberProperties.forEach {
val field = it
val annotation = it.findAnnotation<StringConstraint>()
if (annotation !
= null && field.getter.visibility == KVisibility.PUBLIC) {
val fieldValue = field.getter.call(data) as String
// set validation with annotation field value
if (fieldValue.length !
in annotation.minLength..annotation.maxLength) {
result.isValid = false
result.invalidFieldNames.add(field.name)
}
}
}
return result
}
}
fun main() {
val data = Data(
"극도의 투명함",
"투명함은 단순히 결과가 잘 공유되는 것 이상을 의미합니다.
우리는 결과뿐 아니라 의도와 맥락, 과정까지도 알 수 있을 만큼 공유하는 것을 투명하다고 합니다.
우리가 추구하는 극도의 솔직함은 투명함이 전제되어야만 발현된다고 믿습니다.
"
)
val validationResult = FieldValidator.validate(data)
// Validation: false / not validated Field: (title)
println("Validation: ${validationResult.isValid} / not validated Field: ${validationResult.invalidFieldNames}")
}
다음 글에서는 두 번째 Annotation 커스텀 방법,
코드 생성을 사용하여 컴파일 타임에 주석에 논리 삽입
알아 보자!