0Pricing
Kotlin Academy · Pelajaran

Refleksi Praktis

Baca anotasi secara dinamis

Refleksi Praktis adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Anotasi Bertemu Refleksi

Anotasi dengan retensi RUNTIME dapat ditemukan saat program berjalan melalui refleksi. Kombinasi ini menjadi dasar bagi pustaka serialisasi, validator, dan injeksi dependensi.

Dalam pelajaran ini, kita membaca anotasi kita sendiri secara dinamis.

Membaca Anotasi Kelas

Setiap KClass menyediakan daftar annotations. Kita dapat memindainya untuk menemukan anotasi tertentu berdasarkan jenisnya.

@Retention(AnnotationRetention.RUNTIME)
annotation class Entity(val table: String)

@Entity("users")
class User

fun main() {
    val ann = User::class.annotations
        .filterIsInstance<Entity>()
        .first()
    println(ann.table)
}

Pembantu findAnnotation

Ekstensi findAnnotation lebih rapi daripada melakukan penyaringan secara manual. Ekstensi ini mengembalikan anotasi tersebut atau null.

import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Entity(val table: String)

@Entity("orders")
class Order

fun main() {
    val ann = Order::class.findAnnotation<Entity>()
    println(ann?.table)
}

Anotasi pada Properti

Properti memiliki anotasinya sendiri. Lakukan iterasi pada memberProperties dan periksa annotations milik setiap properti.

import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Column(val name: String)

class Product(@Column("product_id") val id: Int, val title: String)

fun main() {
    Product::class.memberProperties.forEach { prop ->
        val col = prop.findAnnotation<Column>()
        if (col != null) println(prop.name + " -> " + col.name)
    }
}

Membangun Serialisator Mini

Gabungkan pembacaan properti dengan anotasi untuk menghasilkan keluaran. Di sini, kita memetakan setiap properti menjadi string kunci=nilai menggunakan nama kolom jika tersedia.

import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Column(val name: String)

class Item(@Column("item_id") val id: Int, val name: String)

fun main() {
    val item = Item(7, "Book")
    val parts = Item::class.memberProperties.map { p ->
        val key = p.findAnnotation<Column>()?.name ?: p.name
        key + "=" + p.getter.call(item)
    }
    println(parts.joinToString(", "))
}

Melewati dengan Penanda

Anotasi penanda dapat menandai properti yang harus diabaikan. Kita menguji keberadaannya dengan hasAnnotation.

import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.hasAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Transient2

class Account(val id: Int, @Transient2 val secret: String)

fun main() {
    Account::class.memberProperties
        .filterNot { it.hasAnnotation<Transient2>() }
        .forEach { println(it.name) }
}

Membaca Argumen Anotasi

Setelah memiliki instans anotasi, parameternya hanyalah properti biasa. Bacalah seperti bidang apa pun.

import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Validated(val min: Int, val max: Int)

@Validated(min = 1, max = 100)
class Quantity

fun main() {
    val v = Quantity::class.findAnnotation<Validated>()!!
    println("range " + v.min + ".." + v.max)
}

Anotasi pada Fungsi

Fungsi juga dapat diberi anotasi dan diperiksa. Kerangka kerja menggunakan hal ini untuk menemukan penangan, seperti pelari pengujian yang menemukan metode pengujian.

import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Route(val path: String)

class Api {
    @Route("/home")
    fun home() = "home page"
}

fun main() {
    Api::class.memberFunctions.forEach { f ->
        f.findAnnotation<Route>()?.let { println(f.name + " @ " + it.path) }
    }
}

Menjalankan Perilaku

Baca anotasi rute lalu benar-benar kirimkan sebuah call. Inilah inti cara kerja kerangka kerja perutean.

import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Route(val path: String)

class Api {
    @Route("/ping")
    fun ping() = "pong"
}

fun main() {
    val api = Api()
    val target = "/ping"
    Api::class.memberFunctions.forEach { f ->
        if (f.findAnnotation<Route>()?.path == target) {
            println(f.call(api))
        }
    }
}

Penggunaan di Dunia Nyata

Refleksi berbasis anotasi menjadi dasar bagi banyak pustaka:

  • Pemetaan serialisasi JSON dari bidang ke kunci
  • Validasi yang menerapkan batasan
  • Perutean yang mencocokkan jalur dengan penangan
  • Injeksi dependensi yang menghubungkan komponen

Tetap Terarah

Refleksi sebaiknya dibatasi pada kode penyiapan dan kode kerangka kerja yang dijalankan sekali atau jarang. Simpan hasilnya dalam cache jika memungkinkan. Untuk jalur panas per permintaan, utamakan pemrosesan saat kompilasi.

Pemeriksaan Singkat

Uji pemahaman Anda tentang penggunaan praktis refleksi.

Ringkasan

Anda menggabungkan anotasi dan refleksi untuk:

  • Menemukan anotasi kelas, properti, dan fungsi
  • Membaca argumen anotasi saat program berjalan
  • Membangun serialisator mini dan pengirim rute
  • Melewati bidang dengan anotasi penanda

Beginilah kerangka kerja nyata dibangun.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Refleksi Praktis” gratis?

Ya — teks lengkap “Refleksi Praktis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Refleksi Praktis”?

Baca anotasi secara dinamis Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Refleksi Praktis” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menggunakan Anotasi
  2. Mendefinisikan Anotasi
  3. Dasar-dasar Refleksi
  4. Refleksi Praktis
← Kembali ke Kotlin Academy