[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

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

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

ความเร็วเน็ตที่แท้จริง Mbps MBps ???

Popular

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

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

[Android] เปิดเครื่องไม่ได้ โลโก้ค้าง (Boot Loop)

ความเร็วเน็ตที่แท้จริง Mbps MBps ???

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

[Java] Java Static Variable และ Static Method

Push Notification คืออะไร มีวิธีทำอย่างไร (No Code)

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

[Java] Spring Framework กับความสามารถ Dependency Injection

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