Pengesahan dan Pemetaan Berasaskan Pantulan
Bina pengesah atau pemeta objek mudah menggunakan pantulan dipacu anotasi.
Pengesahan dan Pemetaan Berasaskan Pantulan ialah pelajaran Kotlin Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kotlin Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.
Perkara yang Diselesaikan oleh Corak Ini
Pengesahan berasaskan refleksi membaca anotasi daripada sifat kelas pada masa jalan dan menggunakan peraturan pengesahan secara automatik — tiada pemeriksaan manual bagi setiap medan. Teknik yang sama menggerakkan pemeta ORM yang menukar antara objek dan baris pangkalan data.
Anotasi Validate
Takrifkan anotasi yang dikekalkan pada masa jalan dan menyasarkan sifat:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Validate(
val minLength: Int = 0,
val maxLength: Int = Int.MAX_VALUE,
val pattern: String = ""
)Menganotasi Kelas Data
Gunakan @Validate pada sifat kelas data. Pengesah akan mengimbasnya pada masa jalan:
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 Pengesah
Gunakan KClass.declaredMemberProperties untuk mengulangi sifat, mencari anotasi dan mengumpulkan ralat:
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 Pengesah
Panggil validate() dengan sebarang objek yang dianotasi. Fungsi ini mengembalikan senarai mesej ralat; senarai kosong bermaksud sah:
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 kepada Peta dengan @Column
Satu lagi corak refleksi memetakan objek kepada Map menggunakan anotasi @Column untuk memberikan nama lajur:
@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
Anotasi kelas data dan panggil toMap() untuk mendapatkan peta berasaskan kunci lajur yang sedia digunakan untuk 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 Keputusan Refleksi dalam Cache
Imbasan refleksi memerlukan kos yang tinggi. Simpan pemetaan sifat kepada anotasi dalam cache semasa permulaan menggunakan ConcurrentHashMap yang dikunci oleh 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 Pengesahan dan Pemetaan
Anda boleh menyusun anotasi pada satu sifat dan memproses setiap satunya secara berasingan. Lakukan pengesahan dahulu, kemudian pemetaan — atau lakukan kedua-duanya dalam satu lelaran dengan mengumpulkan setiap jenis anotasi:
data class Product(
@Validate(minLength = 1) @Column("product_name") val name: String,
@Column("price") val price: Double
)Had
Pengesahan berasaskan refleksi berkuasa tetapi mempunyai pertukaran: ia menambah beban masa jalan, bergantung pada pengekalan anotasi dan tidak dapat mengesan ralat pada masa kompilasi. Untuk pengesahan yang kritikal dari segi prestasi atau selamat pada masa kompilasi, pertimbangkan kod yang dijana oleh KSP.
Bila Hendak Menggunakan Corak Ini
Pengesahan berasaskan refleksi amat berguna dalam kod rangka kerja yang perlu mengendalikan kelas yang ditakrifkan pengguna secara sewenang-wenangnya: ORM, pensiri, pengesah borang dan pengikat konfigurasi. Kod aplikasi yang memiliki jenisnya sendiri hendaklah mengutamakan pengesahan eksplisit demi kelajuan dan kejelasan.
Semakan Ringkas
Apakah dasar pengekalan anotasi yang diperlukan supaya anotasi pengesahan boleh dibaca pada masa jalan?
Imbas Kembali: Pengesahan dan Pemetaan Berasaskan Refleksi
Kesimpulan utama:
- Isytiharkan anotasi yang dikekalkan pada masa jalan dan menyasarkan sifat
- Gunakan
declaredMemberProperties+findAnnotationuntuk memacu pengesahan atau pemetaan - Simpan keputusan bagi setiap
KClassdalam cache untuk mengelakkan beban refleksi berulang - Susun berbilang anotasi pada satu sifat untuk tingkah laku gabungan
- Pertimbangkan KSP sebagai alternatif masa kompilasi dalam laluan yang kritikal dari segi prestasi
Pelajari Kotlin dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Pengesahan dan Pemetaan Berasaskan Pantulan” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kotlin Academy, termasuk “Pengesahan dan Pemetaan Berasaskan Pantulan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pengesahan dan Pemetaan Berasaskan Pantulan”?
Bina pengesah atau pemeta objek mudah menggunakan pantulan dipacu anotasi. Anda berlatih Kotlin Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Kotlin Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Kotlin Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Pengesahan dan Pemetaan Berasaskan Pantulan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kotlin Academy ini?
Ya. Setiap pelajaran Kotlin Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pantulan Kotlin: KClass, KFunction, KProperty
- Mencipta dan Menyasarkan Anotasi Tersuai
- Membaca Anotasi semasa Masa Jalan
- Pengesahan dan Pemetaan Berasaskan Pantulan