Reflection เชิงปฏิบัติ
อ่าน Annotation แบบไดนามิก
Reflection เชิงปฏิบัติ เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
แอนโนเทชันกับรีเฟลกชัน
แอนโนเทชันที่มีการคงอยู่แบบ RUNTIME สามารถค้นพบได้ขณะทำงานผ่านรีเฟลกชัน การทำงานร่วมกันนี้เป็นกลไกเบื้องหลังซีเรียลไลเซอร์ ตัวตรวจสอบ และการฉีดการพึ่งพา
ในบทเรียนนี้ เราจะอ่านแอนโนเทชันของเราเองแบบไดนามิก
การอ่านแอนโนเทชันของคลาส
KClass ทุกตัวมีรายการ annotations ให้ใช้งาน เราสามารถตรวจดูรายการนี้เพื่อค้นหาแอนโนเทชันตามชนิดที่ต้องการ
@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)
}ตัวช่วย findAnnotation
ส่วนขยาย findAnnotation เขียนได้สะอาดกว่าการกรองด้วยตนเอง โดยจะส่งคืนแอนโนเทชันหรือ 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)
}แอนโนเทชันบนพร็อพเพอร์ตี
พร็อพเพอร์ตีมีแอนโนเทชันของตนเอง ให้วนดู memberProperties และตรวจสอบ annotations ของพร็อพเพอร์ตีแต่ละรายการ
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)
}
}การสร้างซีเรียลไลเซอร์ขนาดเล็ก
รวมการอ่านพร็อพเพอร์ตีเข้ากับแอนโนเทชันเพื่อสร้างผลลัพธ์ ในที่นี้เราจะแปลงพร็อพเพอร์ตีแต่ละรายการเป็นสตริงในรูปแบบ คีย์=ค่า โดยใช้ชื่อคอลัมน์เมื่อมีการระบุไว้
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(", "))
}การข้ามด้วยเครื่องหมาย
แอนโนเทชันตัวทำเครื่องหมายสามารถระบุให้ข้ามพร็อพเพอร์ตีบางรายการได้ เราตรวจสอบว่ามีแอนโนเทชันนี้อยู่หรือไม่ด้วย 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) }
}การอ่านอาร์กิวเมนต์ของแอนโนเทชัน
เมื่อมีอินสแตนซ์ของแอนโนเทชันแล้ว พารามิเตอร์ของมันก็เป็นพร็อพเพอร์ตีทั่วไป คุณสามารถอ่านได้เช่นเดียวกับฟิลด์ใด ๆ
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)
}แอนโนเทชันบนฟังก์ชัน
ฟังก์ชันสามารถมีแอนโนเทชันและถูกตรวจสอบได้เช่นกัน เฟรมเวิร์กใช้ความสามารถนี้เพื่อค้นหาตัวจัดการ เช่น ตัวรันทดสอบที่ค้นหาเมธอดทดสอบ
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) }
}
}การควบคุมพฤติกรรม
อ่านแอนโนเทชันเส้นทาง แล้วส่งต่อการเรียกใช้จริง นี่คือแก่นสำคัญของวิธีทำงานของเฟรมเวิร์กจัดเส้นทาง
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))
}
}
}การใช้งานในโลกจริง
รีเฟลกชันที่ขับเคลื่อนด้วยแอนโนเทชันเป็นรากฐานของไลบรารีมากมาย:
- การซีเรียลไลซ์ข้อมูลเจสันโดยจับคู่ฟิลด์กับคีย์
- การตรวจสอบเพื่อบังคับใช้ข้อกำหนด
- การจัดเส้นทางโดยจับคู่เส้นทางกับตัวจัดการ
- การฉีดการพึ่งพาเพื่อเชื่อมส่วนประกอบ
จำกัดขอบเขตการใช้งาน
ควรจำกัดการใช้รีเฟลกชันไว้กับการเตรียมระบบและโค้ดของเฟรมเวิร์กที่ทำงานครั้งเดียวหรือนาน ๆ ครั้ง หากทำได้ ให้แคชผลลัพธ์ไว้ สำหรับเส้นทางการทำงานที่ถูกเรียกบ่อยในแต่ละคำขอ ควรเลือกการประมวลผลขณะคอมไพล์
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับรีเฟลกชันเชิงปฏิบัติของคุณ
ทบทวน
คุณได้ผสานแอนโนเทชันกับรีเฟลกชันเพื่อ:
- ค้นหาแอนโนเทชันของคลาส พร็อพเพอร์ตี และฟังก์ชัน
- อ่านอาร์กิวเมนต์ของแอนโนเทชันขณะทำงาน
- สร้างซีเรียลไลเซอร์ขนาดเล็กและตัวกระจายเส้นทาง
- ข้ามฟิลด์ที่มีแอนโนเทชันตัวทำเครื่องหมาย
นี่คือวิธีสร้างเฟรมเวิร์กจริง
เรียนรู้ Kotlin ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “Reflection เชิงปฏิบัติ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Reflection เชิงปฏิบัติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Reflection เชิงปฏิบัติ”
อ่าน Annotation แบบไดนามิก คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “Reflection เชิงปฏิบัติ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม
ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้ Annotation
- การกำหนด Annotation
- พื้นฐาน Reflection
- Reflection เชิงปฏิบัติ