Validasi dan Pemetaan Berbasis Refleksi
Bangun validator atau pemeta objek sederhana menggunakan refleksi berbasis anotasi.
Validasi dan Pemetaan Berbasis Refleksi 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.
Masalah yang Diatasi Pola Ini
Validasi berbasis refleksi membaca anotasi dari properti kelas saat program berjalan dan menerapkan aturan validasi secara otomatis—tanpa pemeriksaan manual untuk setiap bidang. Teknik yang sama mendukung pemeta ORM yang mengonversi antara objek dan baris basis data.
Anotasi Validate
Definisikan anotasi yang dipertahankan saat program berjalan dan menargetkan properti:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Validate(
val minLength: Int = 0,
val maxLength: Int = Int.MAX_VALUE,
val pattern: String = ""
)Memberi Anotasi pada Kelas Data
Terapkan @Validate pada properti kelas data. Validator akan memindai properti tersebut saat program berjalan:
data class UserForm(
@Validate(minLength = 2, maxLength = 50) val name: String,
@Validate(pattern = "^[\\w.]+@[\\w]+\\.[a-z]{2,}$") val email: String,
@Validate(minLength = 8) val password: String
)Fungsi Validasi
Gunakan KClass.declaredMemberProperties untuk mengiterasi properti, menemukan anotasi, dan mengumpulkan kesalahan:
fun validate(obj: Any): List<String> {
val errors = mutableListOf<String>()
for (prop in obj::class.declaredMemberProperties) {
val ann = prop.findAnnotation<Validate>() ?: continue
val value = (prop as KProperty1<Any, *>).get(obj)?.toString() ?: ""
if (value.length < ann.minLength) errors += "${prop.name}: too short"
if (value.length > ann.maxLength) errors += "${prop.name}: too long"
if (ann.pattern.isNotEmpty() && !value.matches(Regex(ann.pattern)))
errors += "${prop.name}: invalid format"
}
return errors
}Menjalankan Validasi
Panggil validate() dengan objek beranotasi apa pun. Fungsi ini mengembalikan daftar pesan kesalahan; daftar kosong berarti objek tersebut valid:
val form = UserForm("A", "not-an-email", "short")
val errors = validate(form)
errors.forEach(::println)
// name: too short
// email: invalid format
// password: too shortPemetaan Objek ke Peta dengan @Column
Pola refleksi lainnya memetakan objek ke Map menggunakan anotasi @Column untuk menyediakan nama kolom:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Column(val name: String)
fun toMap(obj: Any): Map<String, Any?> =
obj::class.declaredMemberProperties
.mapNotNull { prop ->
val col = prop.findAnnotation<Column>() ?: return@mapNotNull null
col.name to (prop as KProperty1<Any, *>).get(obj)
}.toMap()Menggunakan Pemeta
Beri anotasi pada kelas data, lalu panggil toMap() untuk mendapatkan peta dengan kunci kolom yang siap digunakan dalam pernyataan INSERT:
data class User(
@Column("user_name") val name: String,
@Column("user_email") val email: String
)
val user = User("Alice", "alice@example.com")
println(toMap(user))
// {user_name=Alice, user_email=alice@example.com}Menyimpan Hasil Refleksi untuk Digunakan Kembali
Pemindaian refleksi membutuhkan biaya yang besar. Simpan pemetaan properti-ke-anotasi saat aplikasi dimulai menggunakan ConcurrentHashMap yang kuncinya berupa KClass:
val cache = ConcurrentHashMap<KClass<*>, List<Pair<KProperty1<Any,*>, Column>>>()
fun columnsOf(klass: KClass<*>) = cache.getOrPut(klass) {
klass.declaredMemberProperties
.mapNotNull { p ->
p.findAnnotation<Column>()?.let { (p as KProperty1<Any,*>) to it }
}
}Menggabungkan Validasi dan Pemetaan
Anda dapat menumpuk anotasi pada satu properti dan memprosesnya secara terpisah. Lakukan validasi terlebih dahulu, lalu pemetaan — atau lakukan keduanya dalam satu lintasan dengan mengumpulkan setiap jenis anotasi:
data class Product(
@Validate(minLength = 1) @Column("product_name") val name: String,
@Column("price") val price: Double
)Keterbatasan
Validasi berbasis refleksi sangat bermanfaat, tetapi memiliki beberapa kompromi: menambah beban saat program berjalan, bergantung pada retensi anotasi, dan tidak dapat menemukan kesalahan saat kompilasi. Untuk validasi yang mengutamakan performa atau keamanan saat kompilasi, pertimbangkan kode yang dihasilkan KSP.
Kapan Menggunakan Pola Ini
Validasi berbasis refleksi sangat cocok untuk kode kerangka kerja yang harus menangani kelas sembarang yang ditentukan pengguna: pemetaan objek-relasional, alat serialisasi, validator formulir, dan pengikat konfigurasi. Kode aplikasi yang mengendalikan jenisnya sendiri sebaiknya menggunakan validasi eksplisit demi kecepatan dan kejelasan.
Pemeriksaan Singkat
Kebijakan retensi anotasi apa yang diperlukan agar anotasi validasi dapat dibaca saat program berjalan?
Rangkuman: Validasi dan Pemetaan Berbasis Refleksi
Inti penting:
- Deklarasikan anotasi yang dipertahankan saat program berjalan dan menargetkan properti
- Gunakan
declaredMemberProperties+findAnnotationuntuk menjalankan validasi atau pemetaan - Simpan hasil per
KClassuntuk menghindari beban refleksi berulang - Tumpuk beberapa anotasi pada sebuah properti untuk menggabungkan perilaku
- Pertimbangkan KSP sebagai alternatif saat kompilasi pada jalur yang mengutamakan performa
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Validasi dan Pemetaan Berbasis Refleksi” gratis?
Ya — teks lengkap “Validasi dan Pemetaan Berbasis Refleksi” 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 “Validasi dan Pemetaan Berbasis Refleksi”?
Bangun validator atau pemeta objek sederhana menggunakan refleksi berbasis anotasi. 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 “Validasi dan Pemetaan Berbasis Refleksi” 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
- Refleksi Kotlin: KClass, KFunction, KProperty
- Membuat dan Menargetkan Anotasi Kustom
- Membaca Anotasi saat Runtime
- Validasi dan Pemetaan Berbasis Refleksi