Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

Kotlin :: หัดใช้งาน Reflection กันหน่อย

$
0
0

ไปงาน Kotlin meetup 1.2 มา มีทั้งเรื่องของ Kotlin reflection และ PWA with Kotlin ซึ่งเป็นเรื่องที่ไม่เคยใช้งานเลย ดังนั้นจึงลองศึกษาเรื่องของ Reflection ก่อนว่ามันใช้งานอน่างไรบ้าง มาเริ่มกันเลย

Reflection ช่วยให้เราเข้าถึงส่วนต่าง ๆ ของ code ในช่วง runtime ได้

โดยที่ไม่ต้องรู้รายละเอียดต่าง ๆ จากการ compile เลย ยกตัวอย่างเช่น
  • การสร้าง instance ของ class
  • การเข้าถึง function หรือดูชื่อ function ของ class
  • สามารถเรียกใช้งาน function ได้
  • ดูว่ามี field อะไร ชื่ออะไร ค่าอะไร
  • ดู parameter ต่าง ๆ
  • เข้าถึงพวก Generic และ Annotation ได้อีก
สามารถนำ Reflection มาใช้ประโยชน์ได้เช่น กรณีที่เราต้องการจัดการข้อมูลในฐานข้อมูล แน่นอนว่าต้องมี Entity class/type แน่นอน และในระบบจะมี Entity มากมายหลายชนิด ถ้าเราต้องการให้ทำการ generate SQL จาก Entity class เหล่านี้ สามารถนำ Reflection มาใช้ได้ เพื่อทำการดึงชื่อและชนิดของ field/property จาก Entity class ออกมาในขณะ Runtime ทำให้ชีวิตของนักพัฒนาง่ายขึ้น หรือในระบบแบบ plugin เมื่อทำการเพิ่ม plugin เขามาใหม่ ต้องทำการสร้าง instance ใหม่ในขณะ runtime เราสามารถใช้ Reflection สร้าง instance ใหม่ขึ้นมาได้ โดยรวมจะทำงานกับ
  • Class
  • Function
  • Property
  • การทำงานร่วมกับ Java
  • Constructor

มาลองใช้งานกันหน่อย

เริ่มจากตัวอย่างง่าย ๆ ดีกว่า เพราะว่าผมก็มือใหม่ อยากลองทำระบบ plug-in โดยทำการกำหนด class ของ plug-in ไว้ในไฟล์ จากนั้นทำการสร้าง instance ของ plugin แต่ละตัว โดยเราจะใช้ความสามารถของ Reflection นั่นเอง มาเริ่มกันเลย ขั้นตอนที่ 1 ทำการกำหนดโครงสร้างของ plug-in รวมทั้งสร้าง plugin แต่ละตัวขึ้นมา ตัวอย่าง code นั้น plug-in แต่ละตัวจะมีโครงสร้างดังนี้ [gist id="4efca850d31a1ae3198bf242022afa76" file="plugin.kt"] ขั้นตอนที่ 2 ทำการสร้างไฟล์ property สำหรับกำหนดค่าของ plug-in ที่ต้องการ [gist id="4efca850d31a1ae3198bf242022afa76" file="plugins.properties"] ขั้นตอนที่ 3 เขียน code สำหรับสร้าง instance ของ plug-in แต่ละตัวด้วย Reflection [gist id="4efca850d31a1ae3198bf242022afa76" file="Main.kt"] เพียงเท่านี้เราก็สามารถสร้างระบบ plug-in อย่างง่ายได้แล้ว

หรืออีกตัวอย่างคือ การเขียน log ของ data class

สามารถนำ reflection เข้ามาช่วยได้อีก ดังนี้ [gist id="4efca850d31a1ae3198bf242022afa76" file="log.kt"] แต่ reflection นั้นมันจะส่งผลให้ performance การทำงานแย่ลง ดังนั้นการใช้งานต้องมาดูข้อดีและข้อเสียด้วยนะครับ ขอให้สนุกกับการเขียน code

Viewing all articles
Browse latest Browse all 1997

Trending Articles