[Java] Invoke : Java Method Dynamically (Reflection)

         Dynamic Invocation เป็นการเขียนโปรแกรมให้เข้าถึงโครงสร้างของโค้ด เช่น การเรียก method, การเข้าถึง constructor, การอ้างถึง field ซึ่งก็อาจฟังดูปกติ แต่การเรียกใช้ที่ว่านี้ จะเป็นการทำงาน ณ ขณะ runtime

ลองยกตัวอย่างแบบง่ายๆ ดูนะครับ

         ผมมีโปรแกรมที่จำเป็นจะต้องเรียก method ซ้ำๆ กัน โดยชื่อ method คล้ายๆ กัน มองๆแล้ว ก็เอ๊ะ จะเรียกด้วย for ได้ไหมนะ ???
initialProgram1();
initialProgram2();
initialProgram3();
initialProgram4();
initialProgram5();
         ลักษณะความคิดข้างต้นคือ เรากำลังจะยุ่งกับโครงสร้างแล้วล่ะครับ และคำต่อไปที่อยากให้นึกถึงคือ "Reflection"

         การเขียน Java Reflection API ทำได้โดยผ่าน package java.lang.reflect.* ซึ่งมีอยู่แล้วใน JDK ครับ เรามาลองดูโค้ดที่ทำงานแบบเดียวกันด้วย reflection กันดูครับ
Main obj = new Main();
for(int i=1; i <=5; ++i) {
    Method method = obj.getClass().getMethod("initialProgram"+i);
    method.invoke(obj);
}
         จะเห็นว่าเราสามารถเรียกใช้งาน method ด้วย String ที่สามารถเปลี่ยนแปลงขณะ runtime ได้ ซึ่งนอกจากใช้ตามตัวอย่างแล้ว ยังสามารถเล่นได้อีกมากมาย ซึ่งเราสามารถเข้าถึง code ได้แทบทุกอย่าง ถือว่า ปลดแอกจาก OOP ที่เป็นจุดแข็งของภาษา Java กันเลยทีเดียว เช่น java.lang.reflect.Type java.lang.reflect.Modifier java.lang.reflect.Field เป็นต้น

         สำหรับผม ผมคิดว่าการเรียก method แบบนี้อาจมีกรณีให้เลือกใช้ไม่มากหรอกครับ นอกจากจะทำให้ code อ่านยาก เพิ่มความซับซ้อน ยังแย่ในด้าน performance, security ด้วย แต่บางครั้งเราก็อาจจะเจอ code ลักษณะนี้ ที่มีการทำงานแตกต่างจากตัวอย่างที่ผมหยิบยกมาอีกหลายรูปแบบ ถ้าอยากลองปรับใช้ก็ลองเล่นดูนะครับ ยังไงเวลาใช้ก็ระวังกันด้วยนะครับ ระวังเรื่อง RuntimeException ให้ดีนะครับ มีโอกาสเกิดสูงเลยทีเดียวล่ะ



Facebook Comment

Recent Posts

Popular post of 7 days

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

Port Forwarding สำหรับคนใช้ AIS Fibre

Popular

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

เรื่องของ ++i กับ i++

Port Forwarding สำหรับคนใช้ AIS Fibre

วิธีการสมัคร Apple Developer Program และ Enterprise Program ฉบับลงมือเอง

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

ทดสอบ Mobile App แบบ Automated ด้วย Appium ทำยังไงกันนะ

Deeplink, Universal Links คืออะไร ทำงานร่วมกับ Mobile App ได้ยังไง

Android Auto & Apple Carplay คืออะไร ใช้งานยังไง