ภาพสะท้อนคืออะไร
"Reflection ช่วยให้โปรแกรมที่ทำงานใน JVM สามารถตรวจจับและแก้ไขพฤติกรรมของรันไทม์" แนวคิดนี้มักจะสับสนกับการวิปัสสนา นี่คือคำอธิบายของสองคำนี้ในวิกิพีเดีย:
ตัวอย่างการวิปัสสนา: ตัวดำเนินการอินสแตนซ์ของตัวดำเนินการเพื่อตรวจสอบว่าวัตถุเป็นของคลาสเฉพาะหรือไม่
ถ้า (OBJ Instanceof Dog) {Dog D = (Dog) OBJ; d.bark ();}ตัวอย่างการสะท้อน: เมธอด class.forname () สามารถรับวัตถุคลาสที่สอดคล้องกันผ่านชื่อของคลาสหรืออินเตอร์เฟส (สตริงหรือชื่อที่ผ่านการรับรองอย่างสมบูรณ์) เมธอด forname กระตุ้นการเริ่มต้นของคลาส
// ใช้คลาส Reflection <?> c = class.forName ("classPath.and.className"); Object Dog = C.NewInstance (); Method M = C.GetDeclaredMethod ("BARK", คลาสใหม่ <?> [0]); M.Invoke (Dog);ใน Java การสะท้อนนั้นใกล้เคียงกับการวิปัสสนาเพราะคุณไม่สามารถเปลี่ยนโครงสร้างของวัตถุได้ แม้ว่า API บางตัวสามารถใช้ในการปรับเปลี่ยนการมองเห็นวิธีการและคุณสมบัติ แต่ก็ไม่สามารถปรับเปลี่ยนโครงสร้างได้
ภาพสะท้อนของอาร์เรย์
การใช้การสะท้อนของอาร์เรย์คืออะไร? คุณต้องใช้การสะท้อนของอาร์เรย์เมื่อใด มาดูรหัสต่อไปนี้:
จำนวนเต็ม [] nums = {1, 2, 3, 4}; Object [] OBJS = NUMS; // สามารถแปลงเป็นจำนวนเต็มโดยอัตโนมัติ [] เป็นวัตถุ [] วัตถุ obj = nums; // จำนวนเต็ม [] แน่นอนว่าวัตถุ int [] ids = {1, 2, 3, 4}; // object [] objs2 = ids; // int [] ไม่สามารถแปลงเป็นวัตถุ [] วัตถุ obj2 = ids; // int [] เป็นวัตถุตัวอย่างข้างต้นแสดงให้เห็นว่าประเภทพื้นฐานของอาร์เรย์หนึ่งมิติสามารถถือได้ว่าเป็นวัตถุเท่านั้นไม่ใช่เป็นวัตถุ []
int [] [] intarray = {{1, 2}, {3, 4}}; Object [] OA = Intarray; Object OBJ = Intarray; // จำนวนเต็ม [] [] integerArray = intarray; int [] [] ไม่ใช่จำนวนเต็ม [] [] จำนวนเต็ม [] [] integerArray2 = ใหม่จำนวนเต็ม [] [] {{1, 2}, {3, 4}}; Object [] [] OA2 = IntegerArray2; Object [] OA3 = IntegerArray2; Object OBJ2 = IntegerArray2;จากตัวอย่างข้างต้นเราจะเห็นว่าอาร์เรย์สองหลักของ Java เป็นอาร์เรย์อาร์เรย์ มาดูตัวอย่างการสะท้อนอาร์เรย์:
แพ็คเกจ cn.zq.array.reflect; นำเข้า java.lang.reflect.array; นำเข้า Java.util.Arrays; นำเข้า java.util.random; Public Class ArrayReflect {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สุ่มแรนด์ = ใหม่สุ่ม (47); int [] คือ = new int [10]; สำหรับ (int i = 0; i <is.length; i ++) {คือ [i] = rand.nextint (100); } system.out.println (IS); System.out.println (array.aslist (IS)); /*เอาต์พุตสองรายการข้างต้นเป็นสตริงคล้ายกับ "[[i@14318bb]" ซึ่งไม่สามารถแสดงเนื้อหาที่เก็บไว้ในอาร์เรย์ได้ แน่นอนว่าเราใช้ Traversal เพื่อส่งออกเนื้อหาในอาร์เรย์*/ system.out.println ("-1. ข้ามไปยังอาร์เรย์โดยการพิมพ์-"); สำหรับ (int i = 0; i <is.length; i ++) {system.out.print (คือ [i]+""); } system.out.println (); System.out.println ("-2. Traversal ไปยังอาร์เรย์โดยการพิมพ์-"); Object OBJ = IS; // แปลงอาร์เรย์ int หนึ่งมิติเป็น Object System.out.println ("OBJ Isarray:" + obj.getClass (). isarray ()); สำหรับ (int i = 0; i <array.getLength (obj); i ++) {int num = array.getInt (obj, i); // คุณสามารถใช้วิธีการที่ใช้กันทั่วไปนี้เพื่อรับค่าของตำแหน่งดัชนีที่สอดคล้องกัน // ค่าวัตถุ = array.get (obj, i); // ถ้าอาร์เรย์เก็บประเภทพื้นฐานแล้วประเภท wrapper ที่สอดคล้องกับ type system.out.print (num + ""); -เอาท์พุท:
[I@14318BB [[I@14318BB] ---1 พิมพ์อาร์เรย์โดยการสำรวจอาร์เรย์ด้วยวิธีการทั่วไป-58 55 93 61 61 29 68 0 22 7 --2 พิมพ์อาร์เรย์โดยการสำรวจอาร์เรย์โดยการสำรวจอาร์เรย์โดยการสำรวจอาร์เรย์- OBJ Isarray: จริง 58 55 93 61 61 29 68 0 22 7
ตัวอย่างข้างต้นแรกสร้างอาร์เรย์หนึ่งมิติของ INT จากนั้นสุ่มเติมจำนวนเต็ม 0 ~ 100 จากนั้นส่งออกอาร์เรย์โดยตรงผ่านเมธอด system.out.println () หรือใช้เมธอดอาร์เรย์. aslist (ถ้าไม่ใช่อาร์เรย์หนึ่งมิติของประเภทพื้นฐานวิธีนี้สามารถแปลงเป็นรายการตามที่คาดไว้และหากเป็นอาร์เรย์สองมิติไม่สามารถแปลงเป็นรายการตามที่เราคาดหวัง) อาร์เรย์จะถูกแปลงเป็นรายการแล้วเอาต์พุตและการส่งผ่านไม่ใช่ผลลัพธ์ที่เราคาดหวัง ถัดไปเนื้อหาในอาร์เรย์จะถูกส่งออกในวิธีการสำรวจอาร์เรย์ทั่วไปจากนั้นปฏิบัติต่อ int [] เป็นวัตถุและใช้การสะท้อนกลับเพื่อสำรวจเนื้อหา class.isarray () สามารถใช้เพื่อตรวจสอบว่าวัตถุเป็นอาร์เรย์หรือไม่ หากเป็นอาร์เรย์ข้อมูลที่เกี่ยวข้องของอาร์เรย์จะได้รับผ่าน java.lang.reflect.array คลาสเครื่องมือที่สะท้อนอาร์เรย์ คลาสนี้ใช้วิธีการรับบางอย่างเพื่อให้ได้ความยาวของอาร์เรย์แต่ละรุ่นซึ่งใช้เพื่อรับดัชนีที่สอดคล้องกันของอาร์เรย์หนึ่งมิติของประเภทพื้นฐานวิธีการทั่วไปเพื่อให้ได้ค่า (อาร์เรย์วัตถุ, ดัชนี int), วิธีการตั้งค่าและสองวิธีในการสร้างอินสแตนซ์อาร์เรย์ ผ่านคลาสเครื่องมือการสะท้อนกลับของอาร์เรย์มันเป็นเรื่องง่ายที่จะใช้การสะท้อนอาเรย์ในการเขียนรหัสทั่วไปโดยไม่ต้องตัดสินว่าอาร์เรย์ประเภทพื้นฐานใดคืออาร์เรย์ที่กำหนด
แพ็คเกจ cn.zq.array.reflect; นำเข้า java.lang.reflect.array; ระดับสาธารณะ NewarrayInstance {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {Object O = Array.NewInstance (int.class, 20); int [] คือ = (int []) o; System.out.println ("is.length =" + is.length); Object O2 = Array.NewInstance (int.class, 10, 8); int [] [] iss = (int [] []) O2; System.out.println ("iss.length =" + iss.length + ", iss [0] .lenght =" + iss [0] .length); }} is.length = 20 iss.length = 10, iss [0] .lenght = 8 อาร์เรย์ได้ผ่าน 2 วิธีเพื่อสร้างอาร์เรย์
Object Newinstance (คลาส <?> ComponentYpe, ความยาว int) สร้างอาร์เรย์ของความยาวที่ระบุตามคลาสที่ให้ไว้ หาก int.class มีให้ข้างต้นความยาวคือ 10 ซึ่งเทียบเท่ากับ int ใหม่ [10];
Object Newinstance (คลาส <?> ComponentYpe, int ... มิติ) สร้างอาร์เรย์ตามคลาสและมิติที่ให้ไว้ ขนาดพารามิเตอร์ตัวแปรใช้เพื่อระบุความยาวของแต่ละมิติของอาร์เรย์ ดังในตัวอย่างข้างต้นมันเทียบเท่ากับการสร้างอาร์เรย์สองมิติของ Int ใหม่ [10] [8] แต่ไม่สามารถสร้างอาร์เรย์หลายมิติที่มีความยาวที่แตกต่างกันของแต่ละมิติ ด้วยวิธีแรกในการสร้างอาร์เรย์คุณสามารถสร้างอาร์เรย์เช่นนี้ได้ Object O = Array.NewInstance (int []. class, 20) สามารถใช้เพื่อสร้างอาร์เรย์สองมิติซึ่งเทียบเท่ากับ Object O = New Int [20] [];
แน่นอนว่ามันเป็นเรื่องยากที่จะใช้ตัวอย่างข้างต้นเพื่อสร้างอาร์เรย์ แต่จริง ๆ แล้วมันซ้ำซ้อน ทำไมไม่สร้างอาร์เรย์ผ่านใหม่โดยตรง? Reflection สร้างอาร์เรย์ไม่เพียง แต่เร็วกว่าใหม่เท่านั้น แต่ยังรวมถึงโปรแกรมที่เขียนไม่ง่ายดังนั้นจึงไม่ตรงเหมือนใหม่ ในความเป็นจริงมันเป็นเรื่องยากมากที่จะสร้างอาร์เรย์ผ่านการสะท้อน ความต้องการผิดปกติแบบไหนที่จะใช้การสะท้อนเพื่อสร้างอาร์เรย์!
เนื่องจากมีอุปสรรคบางอย่างเมื่อพบการส่งออกอาร์เรย์ของประเภทพื้นฐานสิ่งต่อไปนี้จะใช้การสะท้อนอาร์เรย์เพื่อใช้คลาสเครื่องมือเพื่อให้ได้ผลลัพธ์ที่ต้องการ:
แพ็คเกจ cn.zq.util; นำเข้า Java.io.ByTeArrayOutputStream; นำเข้า java.io.printstream; นำเข้า java.lang.reflect.array; การพิมพ์ระดับสาธารณะ {public static void print (Object obj) {print (obj, system.out); } การพิมพ์โมฆะแบบคงที่สาธารณะ (Object obj, printstream out) {out.println (getPrintString (OBJ)); } โมฆะคงที่สาธารณะ println () {print (system.out); } โมฆะคงที่สาธารณะ println (printstream out) {out.println (); } โมฆะคงที่สาธารณะ printNB (Object obj) {printNB (obj, system.out); } โมฆะคงที่สาธารณะ printNB (Object obj, printstream out) {out.print (getPrintString (OBJ)); } รูปแบบการพิมพ์แบบคงที่สาธารณะ (รูปแบบสตริง, วัตถุ ... วัตถุ) {รูปแบบการส่งคืน (System.out, รูปแบบ, วัตถุ); } รูปแบบการพิมพ์แบบคงที่สาธารณะ (printstream out, รูปแบบสตริง, วัตถุ ... วัตถุ) {object [] handleobjects = วัตถุใหม่ [objects.length]; สำหรับ (int i = 0; i <objects.length; i ++) {Object Object = Objects [i]; if (object == null || isprimitiveWrapper (object)) {handleobjects [i] = object; } else {byteArrayOutputStream bos = ใหม่ byteArrayOutputStream (); printstream ps = ใหม่ printstream (BOS); printnb (วัตถุ, ps); ps.close (); handleobjects [i] = สตริงใหม่ (bos.tobytearray ()); }} out.format (รูปแบบ, handleobjects); กลับมา; } /*** พิจารณาว่าวัตถุที่กำหนดเป็นคลาส wrapper ของประเภทพื้นฐานหรือไม่ * @param o วัตถุวัตถุที่ให้ไว้ * @return หากเป็นคลาส wrapper ของประเภท primitive, return yes, มิฉะนั้นส่งคืนหมายเลข */ private static boolean isprimitiveWrapper (Object O) {return o อินสแตนซ์ของโมฆะ || o อินสแตนซ์ของบูลีน || o อินสแตนซ์ของอักขระ || o อินสแตนซ์ของไบต์ || o อินสแตนซ์ของสั้น || o อินสแตนซ์ของจำนวนเต็ม || o อินสแตนซ์ยาว || o อินสแตนซ์ของลอย || o อินสแตนซ์ของสองเท่า; } สตริงคงที่สาธารณะ getPrintString (Object obj) {StringBuilder result = new StringBuilder (); if (obj! = null && obj.getClass (). isarray ()) {result.append ("["); int len = array.getLength (obj); สำหรับ (int i = 0; i <len; i ++) {ค่าวัตถุ = array.get (obj, i); result.append (getPrintString (ค่า)); ถ้า (i! = len - 1) {result.append (","); }} result.append ("]"); } else {result.append (string.valueof (obj)); } return result.toString (); -คลาสเครื่องมือการพิมพ์ด้านบนมีวิธีการคงที่บางอย่างสำหรับเอาต์พุตและให้เวอร์ชันที่โอเวอร์โหลด คุณสามารถเขียนเวอร์ชันเกินพิกัดตามการตั้งค่าส่วนบุคคลของคุณสนับสนุนการพิมพ์ประเภทพื้นฐานของอาร์เรย์หนึ่งมิติและอาร์เรย์หลายมิติ ดูตัวอย่างต่อไปนี้ของการทดสอบเครื่องมือพิมพ์:
แพ็คเกจ cn.zq.array.reflect; นำเข้า cn.zq.util.print.print; นำเข้า java.io.printstream; นำเข้า cn.zq.util.print.*; Public Class Printtest {บุคคลระดับคงที่ {ตัวนับ int แบบคงที่ส่วนตัว; ID int สุดท้ายส่วนตัว = ตัวนับ ++; สตริงสาธารณะ toString () {return getClass (). getSimplename () + id; }} โมฆะคงที่สาธารณะหลัก (String [] args) โยนข้อยกเว้น {print ("-พิมพ์ไม่ใช่อาร์เรย์-"); พิมพ์ (วัตถุใหม่ ()); พิมพ์ ("-พิมพ์อาร์เรย์พื้นฐานแบบหนึ่งมิติ-"); int [] คือ = new int [] {1, 22, 31, 44, 21, 33, 65}; พิมพ์ (คือ); พิมพ์ ("-พิมพ์อาร์เรย์สองมิติของประเภทพื้นฐาน-"); int [] [] iss = new int [] [] {{11, 12, 13, 14}, {21, 22,}, {31, 32, 33}}; พิมพ์ (ISS); พิมพ์ ("-พิมพ์อาร์เรย์หนึ่งมิติของประเภทที่ไม่ใช่ฐาน-"); บุคคล [] บุคคล = คนใหม่ [10]; สำหรับ (int i = 0; i <person.length; i ++) {บุคคล [i] = คนใหม่ (); } พิมพ์ (บุคคล); พิมพ์ (บุคคล); พิมพ์ ("-พิมพ์อาร์เรย์สองมิติของประเภทที่ไม่ได้ใช้งาน-"); บุคคล [] [] person2 = บุคคลใหม่ [] [] {{คนใหม่ ()}, {คนใหม่ (), คนใหม่ ()}, {คนใหม่ (), คนใหม่ (), คนใหม่ (), คนใหม่ (),},}; พิมพ์ (PERSONS2); พิมพ์ ("-พิมพ์อาร์เรย์ที่ว่างเปล่า-"); พิมพ์ (ใหม่ int [] {}); พิมพ์ ("-พิมพ์อาร์เรย์ที่มีค่าว่าง-"); Object [] Objects = New Object [] {New Person (), Null, Object (), Integer ใหม่ (100)}; พิมพ์ (วัตถุ); พิมพ์ ("-พิมพ์อาร์เรย์สองมิติสำหรับกรณีพิเศษ-"); วัตถุ [] [] objects2 = วัตถุใหม่ [3] []; Objects2 [0] = วัตถุใหม่ [] {}; Objects2 [2] = วัตถุ; พิมพ์ (Objects2); พิมพ์ ("-เอาต์พุตผลลัพธ์ของอาร์เรย์หนึ่งมิติไปยังไฟล์-"); printstream out = new printstream ("out.c"); ลอง {print (iss, out); } ในที่สุด {out.close (); } พิมพ์ ("-รูปแบบเอาต์พุต-"); รูปแบบ (" %-6d %s %b %s", 10086, "คือ", true, iss); /** * วิธีการที่ใช้กันทั่วไปของคลาสเครื่องมือการพิมพ์มีการระบุไว้ด้านบน * นอกจากนี้ยังมีวิธีการบางอย่างที่ไม่อยู่ในรายการโปรดตรวจสอบด้วยตัวคุณเอง - เอาท์พุท:
-Print Non-Array-java.lang.object@61de33-พิมพ์ประเภทพื้นฐานหนึ่งมิติ-[1, 22, 31, 44, 21, 33, 65]-พิมพ์สองมิติของประเภทพื้นฐาน-[11, 12, 13, 14], [21, 22], [31, 32, 33] person1, person2, person3, person4, person5, person6, person7, person8, person9]-พิมพ์สองมิติของประเภทที่ไม่ใช่ฐาน-[[person10], [person11, person12], [person13, person14, person15] -พิมพ์สองมิติอาร์เรย์ในกรณีพิเศษ-[[], null, [person16, null, java.lang.object@ca0b6, 100]]-พิมพ์ผลลัพธ์ของอาร์เรย์หนึ่งมิติกับไฟล์--รูปแบบเอาท์พุท-10086 เป็นจริง [[11, 12, 13, 14], [21, 22]
ไฟล์เอาต์พุต:
จะเห็นได้ว่าคลาสเครื่องมือการพิมพ์มีความสามารถในการพิมพ์ประเภทพื้นฐานของอาร์เรย์หนึ่งมิติและอาร์เรย์หลายมิติ โดยทั่วไปแล้วคลาสเครื่องมือข้างต้นนั้นค่อนข้างใช้งานได้จริงเพื่อไม่ให้เขียนโค้ดด้วยตนเองทุกครั้งที่คุณต้องการดูเนื้อหาในอาร์เรย์ นั่นจะลำบากเกินไป เพียงใช้คลาสเครื่องมือพิมพ์ในอนาคต สะดวกแค่ไหน
คลาสเครื่องมือด้านบนทำงานได้ดีมาก แต่ถ้ามีข้อกำหนด: ให้อาร์เรย์ (และบางทีคอนเทนเนอร์อื่น ๆ ) คุณสามารถสร้างรายการให้ฉันได้ แล้วเราควรทำอย่างไร? ในความเป็นจริง arrays.aslist ไม่ได้รับผลลัพธ์ที่เราคาดหวังเสมอไป แม้ว่า Java5 จะเพิ่มยาชื่อสามัญ แต่ก็มีข้อ จำกัด และไม่สามารถเป็นแบบทั่วไปได้เท่ากับเทมเพลต C ++ มันเป็นเพราะมีประเภทพื้นฐานใน Java แม้ว่าจะมีกลไกการห่ออัตโนมัติ แต่ก็ไม่สามารถใช้กับยาชื่อสามัญได้ ประเภทพารามิเตอร์ต้องเป็นประเภทที่แน่นอนไม่ใช่ประเภทพื้นฐาน นี่คือทางออกสำหรับคุณเอง:
แพ็คเกจ cn.zq.util; นำเข้า java.lang.reflect.array; นำเข้า java.util.arraylist; นำเข้า Java.util.Arrays; นำเข้า Java.util.enumeration; นำเข้า java.util.iterator; นำเข้า java.util.list; นำเข้า java.util.map; collection collection taren public {รายการคงที่สาธารณะ <?> aslist (object obj) {return converttolist (makeiterator (obj)); } สาธารณะคงที่ <T> รายการ <t> ConvertToList (ตัววนซ้ำ <t> iterator) {ถ้า (iterator == null) {return null; } รายการ <t> list = new ArrayList <T> (); ในขณะที่ (iterator.hasnext ()) {list.add (iterator.next ()); } return list; } @suppresswarnings ({"rawtypes", "unchected"}) public Static Iterator <?> MakeIterator (Object obj) {ถ้า (OBJ Instanceof Iterator) {return (iterator <?>) obj; } if (obj == null) {return null; } if (OBJ Instanceof Map) {obj = ((แผนที่ <?,?>) obj). entryset (); } iterator <?> iterator = null; if (OBJ Instanceof iterable) {iterator = ((iterable <?>) obj) .Iterator (); } อื่นถ้า (obj.getClass (). isarray ()) {// object [] objs = (object []) obj; // หรืออาร์เรย์ของประเภทดั้งเดิมไม่สามารถแปลงได้เช่นรายการ ArrayList นี้ = arrayList ใหม่ (array.getLength (OBJ)); สำหรับ (int i = 0; i <array.getLength (obj); i ++) {list.add (array.get (obj, i)); } iterator = list.iterator (); } อื่นถ้า (OBJ instanceof การแจงนับ) {iterator = ใหม่ enumerationIterator ((การแจงนับ) OBJ); } else {iterator = array.aslist (OBJ) .Iterator (); } return iterator; } Public Static Class enumerationiterator <T> ใช้ Iterator <t> {การแจงนับส่วนตัว <T> การแจงนับ; การแจงนับสาธารณะ (การแจงนับ <t> การแจงนับ) {this.enumeration = การแจงนับ; } บูลีนสาธารณะ hasnext () {return enumeration.hasmoreElements (); } สาธารณะ t ถัดไป () {return enumeration.nextElement (); } โมฆะสาธารณะลบ () {โยน unsupportedoperationException ใหม่ (); -รหัสทดสอบ:
แพ็คเกจ cn.zq.array.reflect; นำเข้า java.util.iterator; นำเข้า java.util.list; นำเข้า cn.zq.array.reflect.printtest.person; นำเข้า cn.zq.util.collectionutils; collection collectionlstest public {public static void main (string [] args) {system.out.println ("--- ประเภทพื้นฐานอาร์เรย์หนึ่งมิติหนึ่งมิติ-"); int [] nums = {1, 3, 5, 7, 9}; รายการ <?> list = collectedUtils.aslist (nums); System.out.println (รายการ); System.out.println ("-ไม่ใช่ประเภทพื้นฐานอาร์เรย์หนึ่งมิติ-"); บุคคล [] บุคคล = บุคคลใหม่ [] {คนใหม่ (), คนใหม่ (), คนใหม่ (),}; รายการ <person> personlist = (รายการ <person>) collectionutils.aslist (บุคคล); System.out.println (PersonList); System.out.println (PersonList); System.out.println ("-ตัววนซ้ำ-"); ตัววนซ้ำ <person> iterator = personlist.iterator (); รายการ <person> personlist2 = (รายการ <person>) collectionutils.aslist (iterator); System.out.println (personlist2); -เอาท์พุท:
-ประเภทอาร์เรย์หนึ่งมิติ-[1, 3, 5, 7, 9]-ประเภทที่ไม่ใช้แบบหนึ่งมิติหนึ่งมิติ-[person0, person1, person2]-titerator-[person0, person1, person2]
ในไลบรารีคลาสคอนเทนเนอร์ Java สามารถแบ่งออกเป็นคอลเลกชันแผนที่และอาร์เรย์ เนื่องจากตัววนซ้ำ (และการแจงนับอินเตอร์เฟซดั้งเดิม) เป็นอินเทอร์เฟซทั่วไปของคอนเทนเนอร์ทั้งหมดและอินเทอร์เฟซคอลเลกชันมาจาก Iterable (ตัววนซ้ำของอินเทอร์เฟซนี้จะส่งคืนตัววนซ้ำ) สถานการณ์เหล่านี้จะถูกประมวลผลทีละหนึ่งในวิธีการ makeiterator สำหรับประเภทแผนที่จะต้องมีการเรียกใช้เฉพาะเมธอด entrySet () สำหรับคลาสที่ใช้อินเทอร์เฟซแบบ iterable (รวมถึงคอลเลกชัน) ให้โทรหา iterator () เพื่อรับวัตถุ Iterator โดยตรง สำหรับประเภทการแจงนับให้ใช้ตัวแจงนับอะแดปเตอร์สำหรับการปรับตัว สำหรับอาร์เรย์ให้ใช้การสะท้อนอาร์เรย์เพื่อสำรวจอาร์เรย์ไปยัง ArrayList และเรียกเมธอดอาร์เรย์ ASLIST () เพื่อสร้างรายการสำหรับประเภทอื่น CollectionUtils ยังมีวิธีการอื่น ๆ ในการแปลงและคุณสามารถเพิ่มวิธีการที่คุณต้องการได้ตามต้องการ
สรุป: การสะท้อนกลับอาเรย์ให้วิธีการที่สะดวกและยืดหยุ่นมากขึ้นสำหรับการออกแบบที่อาร์เรย์อาจปรากฏขึ้นเพื่อไม่ให้เขียนคำสั่งการตัดสินที่ลำบากมากขึ้น ความยืดหยุ่นนี้จ่ายราคาของประสิทธิภาพและไม่จำเป็นต้องใช้การสะท้อนกลับอาเรย์เมื่อไม่จำเป็นต้องมีการสะท้อนอาร์เรย์เลย ไม่ว่าจะใช้การสะท้อนอาร์เรย์จะแตกต่างกันในการพัฒนาจริง เลือกว่าจะใช้การสะท้อนอาร์เรย์ตามความต้องการหรือไม่ วิธีที่ดีที่สุดคือการสำรวจวิธีการฝึกฝนเขียนในแบบที่คุณคิดและปรับปรุงในทางปฏิบัติอย่างต่อเนื่อง