0Pricing
Kotlin Academy · Lekcja

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)  // true

Iterowanie 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)  // 3

hasAnnotation 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 hasAnnotation() do sprawdzenia logicznego
  • Mechanizm działa dla KClass, KFunction, KProperty i KParameter
  • 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

  1. Refleksja w Kotlinie: KClass, KFunction, KProperty
  2. Tworzenie własnych adnotacji i określanie ich celów
  3. Odczytywanie adnotacji w czasie działania
  4. Walidacja i mapowanie oparte na refleksji
← Powrót do Kotlin Academy