[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 ยังไงเวลาใช้ก็ระวังกันด้วยนะครับ ไม่งั้นอาจะทำให้เกิด Exception ได้ เช่น  java.lang.NoSuchFieldException, java.lang.NoSuchMethodException เป็นต้น

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


Facebook Comment

Popular post of 7 days

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

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

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