Odczytywanie adnotacji w czasie działania
Pobieraj instancje adnotacji z deklaracji za pomocą refleksji Kotlina.
Odczytywanie adnotacji w czasie działania to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Wymagania wstępne
Aby odczytywać adnotacje w czasie działania, potrzebne są: (1) adnotacja zadeklarowana za pomocą @Retention(RUNTIME), (2) zależność kotlin-reflect w ścieżce klas oraz (3) odwołanie KClass, KFunction lub KProperty do adnotowanego elementu.
Odczytywanie adnotacji z KClass
Należy wywołać annotations na obiekcie KClass, aby pobrać wszystkie adnotacje tej klasy, lub użyć findAnnotation dla określonego typu:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
annotation class Table(val name: String)
@Table(name = "users")
class UserEntity
val ann = UserEntity::class.findAnnotation<Table>()
println(ann?.name) // "users"Odczytywanie adnotacji z właściwości
Dostęp do adnotacji właściwości można uzyskać za pomocą KProperty.annotations lub findAnnotation:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Column(val name: String)
data class User(@Column("user_name") val name: String)
val prop = User::name
val col = prop.findAnnotation<Column>()
println(col?.name) // "user_name"Odczytywanie adnotacji z funkcji
Należy użyć KFunction.findAnnotation, aby odczytać adnotacje funkcji:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class Transactional
class UserService {
@Transactional
fun save(user: User) { /*...*/ }
}
val fn = UserService::save
val isTx = fn.hasAnnotation<Transactional>()
println(isTx) // trueIterowanie po wszystkich właściwościach w poszukiwaniu adnotacji
Typowy schemat polega na przeskanowaniu wszystkich zadeklarowanych właściwości klasy i zebraniu tych, które mają określoną adnotację:
fun <A : Annotation> KClass<*>.annotatedProperties(
annotationClass: KClass<A>
): List<Pair<KProperty1<*, *>, A>> =
declaredMemberProperties
.mapNotNull { prop ->
prop.findAnnotation(annotationClass)?.let { ann -> prop to ann }
}Odczytywanie adnotacji parametrów
Dostęp do adnotacji parametrów konstruktora można uzyskać za pomocą KFunction.parameters:
class Repo(
@param:Validate(minLength = 3) val name: String
)
val ctor = Repo::class.primaryConstructor!!
val param = ctor.parameters.first()
val ann = param.findAnnotation<Validate>()
println(ann?.minLength) // 3hasAnnotation a findAnnotation
Należy użyć hasAnnotation, aby wykonać sprawdzenie logiczne, oraz findAnnotation, gdy potrzebne są wartości właściwości adnotacji. Obie są funkcjami rozszerzającymi z pakietu kotlin.reflect.full.
Przechodzenie po hierarchii klas
Adnotacje na nadklasach lub interfejsach NIE są automatycznie dziedziczone w refleksji Kotlina. Jeśli potrzebne są dziedziczone adnotacje, należy przejść po elementach KClass.superclasses lub użyć KClass.allSuperclasses.
fun KClass<*>.findAnnotationRecursive(ann: KClass<out Annotation>) =
generateSequence(this) { null } // simplified — real impl walks supers
.flatMap { it.annotations }
.firstOrNull { it.annotationClass == ann }Wydajność
Wywołania refleksji są powolne. Jeśli adnotacje są skanowane podczas uruchamiania frameworka, należy buforować wyniki w mapie, której kluczami są obiekty KClass. Nie wolno odczytywać adnotacji w intensywnie wykonywanych ścieżkach obsługi poszczególnych żądań lub klatek.
Cele zastosowania i pola JVM
W przypadku adnotacji właściwości z celem @field: adnotacja znajduje się w polu zapasowym JVM. Należy uzyskać do niej dostęp za pomocą refleksji Javy (KProperty.javaField?.annotations), a nie listy annotations Kotlina, która obejmuje wyłącznie miejsce deklaracji w Kotlinie.
Praktyczny przykład: prosty mapper ORM
Niewielki mapper ORM odczytuje adnotacje @Column, aby utworzyć listę kolumn SQL:
fun columns(klass: KClass<*>): String =
klass.declaredMemberProperties
.mapNotNull { it.findAnnotation<Column>()?.name }
.joinToString(", ")
println(columns(User::class)) // "user_name, email"Szybkie sprawdzenie
Jak odczytać z obiektu KClass konkretną adnotację typu MyAnn?
Podsumowanie: odczytywanie adnotacji w czasie działania
Najważniejsze wnioski:
- Adnotacja musi mieć
@Retention(RUNTIME) - Należy użyć
findAnnotation, aby pobrać wartość adnotacji, oraz() hasAnnotationdo sprawdzenia logicznego() - Mechanizm działa dla
KClass,KFunction,KPropertyiKParameter - Należy buforować wyniki skanowania podczas uruchamiania, aby uniknąć narzutu przy każdym żądaniu
- W przypadku adnotacji
@field:należy użyćKProperty.javaField
Często zadawane pytania
Czy lekcja „Odczytywanie adnotacji w czasie działania” jest bezpłatna?
Tak — pełny tekst „Odczytywanie adnotacji w czasie działania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Odczytywanie adnotacji w czasie działania”?
Pobieraj instancje adnotacji z deklaracji za pomocą refleksji Kotlina. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Odczytywanie adnotacji w czasie działania”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Refleksja w Kotlinie: KClass, KFunction, KProperty
- Tworzenie własnych adnotacji i określanie ich celów
- Odczytywanie adnotacji w czasie działania
- Walidacja i mapowanie oparte na refleksji