[Java] Invoke : Java Method Dynamically (Reflection)
Dynamic Invocation เป็นการเขียนโปรแกรมให้เข้าถึงโครงสร้างของโค้ด เช่น การเรียก method, การเข้าถึง constructor, การอ้างถึง field ซึ่งก็อาจฟังดูปกติ แต่การเรียกใช้ที่ว่านี้ จะเป็นการทำงาน ณ ขณะ runtime
ลองยกตัวอย่างแบบง่ายๆ ดูนะครับ
ผมมีโปรแกรมที่จำเป็นจะต้องเรียก method ซ้ำๆ กัน โดยชื่อ method คล้ายๆ กัน มองๆแล้ว ก็เอ๊ะ จะเรียกด้วย for ได้ไหมนะ ???
การเขียน Java Reflection API ทำได้โดยผ่าน package
สำหรับผม ผมคิดว่าการเรียก method แบบนี้อาจมีกรณีให้เลือกใช้ไม่มากหรอกครับ นอกจากจะทำให้ code อ่านยาก เพิ่มความซับซ้อน ยังแย่ในด้าน performance, security ด้วย แต่บางครั้งเราก็อาจจะเจอ code ลักษณะนี้ ที่มีการทำงานแตกต่างจากตัวอย่างที่ผมหยิบยกมาอีกหลายรูปแบบ ถ้าอยากลองปรับใช้ก็ลองเล่นดูนะครับ ยังไงเวลาใช้ก็ระวังกันด้วยนะครับ ระวังเรื่อง RuntimeException ให้ดีนะครับ มีโอกาสเกิดสูงเลยทีเดียวล่ะ
ลองยกตัวอย่างแบบง่ายๆ ดูนะครับ
ผมมีโปรแกรมที่จำเป็นจะต้องเรียก 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 ให้ดีนะครับ มีโอกาสเกิดสูงเลยทีเดียวล่ะ