ฉันพบปัญหาเช่นนี้ในงานของฉันเมื่อเร็ว ๆ นี้:
ฉันสร้างเครื่องมือทดสอบสำหรับอินเทอร์เฟซทั้งหมดในโครงการบางโครงการ ด้วยการใช้เทคโนโลยีการแกว่ง Java โครงการมีรุ่นที่แตกต่างกัน ไม่ใช่ทุกอินเทอร์เฟซในเวอร์ชันที่เหมือนกันและเครื่องมือที่ฉันต้องใช้ให้เข้ากันได้กับทุกรุ่น
ดังนั้นปัญหานี้จึงได้รับการแนะนำ:
หากอินเทอร์เฟซบางอย่างไม่มีอยู่ในบางเวอร์ชันจะมีการรายงานข้อผิดพลาดเมื่อทำการดำเนินการนี้ผ่านอินเตอร์เฟส ดังนั้นเพื่อให้เข้ากันได้กับทุกรุ่นคุณต้องพิจารณาว่ามีวิธีการที่มีอยู่ก่อนที่จะเรียกวิธีการหรือไม่ ในเวลาเดียวกันเพื่อที่จะไม่โยนข้อยกเว้นระหว่างการรวบรวมเมื่อเรียกวิธีการ
นอกจากนี้ยังต้องมีการเรียกผ่านการสะท้อนและการใช้งานเฉพาะมีดังนี้:
1. ใช้การสะท้อนเพื่อตรวจสอบว่ามีวิธีการนี้อยู่หรือไม่
/ *** พิจารณาว่าวิธีการที่มีอยู่** @param obj jobjectService อินสแตนซ์* @param เมธอดชื่อชื่อเมธอด* @param paratypes วิธีการแบบฟอร์มพารามิเตอร์ประเภทอาร์เรย์* @return*/ บูลีนคงที่สาธารณะ ลอง {ถ้า (null! = obj) {method method = obj.getClass (). getMethod (methodName, paratypes); }} catch (nosuchmethodexception ex) {showwarninfo (ex.toString ()); log.error ("ข้อยกเว้นเกิดขึ้นที่:" + mainjframe.hostname + "; รายละเอียดคือ:" + ex.getMessage ()); ผลลัพธ์ = เท็จ; } ผลตอบแทนผลลัพธ์; -คำอธิบายพารามิเตอร์:
(1) OBJ: วัตถุที่เรียกวิธีการ
(2) MethodName: ชื่อของวิธีการที่จะเรียก
(3) paratypes: ประเภทพารามิเตอร์ที่ต้องการโดยวิธีการ (หลายตัวคืออาร์เรย์)
ด้วยวิธีนี้คุณสามารถพิจารณาได้ว่าเมธอด (ประเภทพารามิเตอร์) ที่คุณเรียกผ่านวัตถุ OBJ มีอยู่หรือไม่ หากไม่มีอยู่มันจะเรียกใช้ข้อยกเว้น nosuchmethodexception
2. เรียกวิธีการผ่านการสะท้อนเพื่อหลีกเลี่ยงข้อยกเว้นเวลารวบรวม
sysuser = mainjframe.getSysuser (); คลาส [] paramobj = {string.class, long.class, string.class, string.class, int.class}; // ตัดสินว่าวิธีนี้มีอยู่ในบูลีน isexist = Commonutil.judgemethodisexist (sysuser, "createBucket", paramobj); if (isExist) {ลอง {// วิธีการโทรคลาส clazz = sysuser.getClass (); // ชื่อวิธี-ประเภทของพารามิเตอร์ในเมธอด (ในลำดับพารามิเตอร์) เมธอด createBucket = clazz.getDeclaredMethod ("createBucket", string.class, long.class, string.class, string.class, int.class); int create = (int) createBucket.invoke (sysuser, bucketName, long.parselong (bucketsize), bucketloc, bucketacl, integer.parseint (stringutil.emptytozero (bucketcycle))); if (create == 1) {Commonutil.showinfo ("สร้างถังสำเร็จ"); log.info ("Bucket สร้างสำเร็จ"); } else {Commonutil.showwarninfo ("การสร้างถังล้มเหลวข้อผิดพลาดภายในเซิร์ฟเวอร์!"); log.info ("การสร้างถังล้มเหลวข้อผิดพลาดภายในเซิร์ฟเวอร์"); }} catch (Exception Ex) {Commonutil.showwarninfo (ex.getMessage ()); log.error ("ข้อยกเว้นเกิดขึ้นที่:" + mainjframe.hostname + "; รายละเอียดคือ:" + ex.getMessage ()); -ในรหัสข้างต้น:
บรรทัดที่ 1: Sysuser วัตถุที่เรียกวิธีการสร้างวิธีการ Bucket
บรรทัดที่ 2: อาร์เรย์ของประเภทพารามิเตอร์ในวิธีการที่ใช้เมื่อพิจารณาว่ามีวิธีการใดบ้าง
บรรทัดที่ 3: พิจารณาว่าวิธีการนั้นมีอยู่โดยอาร์เรย์ของวัตถุชื่อวิธีและประเภทพารามิเตอร์
ผ่านสามบรรทัดข้างต้นงานต่อไปนี้จะถูกดำเนินการเมื่อมีวิธีการ หากไม่มีอยู่ข้อมูลข้อยกเว้นจะได้รับแจ้ง
บรรทัดที่ 6: รับคลาสของวัตถุ
บรรทัดที่ 7: รับวัตถุวิธีเมธอดพารามิเตอร์คือประเภทที่สอดคล้องกับชื่อวิธีและพารามิเตอร์
บรรทัดที่ 8: เรียกเมธอด CreateBucket ผ่านการสะท้อนวัตถุวิธีพารามิเตอร์คือวัตถุ Sysuser และพารามิเตอร์ที่ต้องการ (ค่า) ตามลำดับ
ด้วยวิธีการข้างต้นไม่มีข้อยกเว้นเวลารวบรวมเกิดขึ้นแม้ว่าอินเทอร์เฟซในวัตถุจะไม่มีอยู่
พูดตามตรงนี่เป็นครั้งแรกที่ฉันพบปัญหากับการสะท้อน Java ในโครงการของฉันดังนั้นจึงจำเป็นต้องบันทึก!
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของแอปพลิเคชันของบทความนี้เกี่ยวกับการสะท้อน Java ในงานจริง ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
บทช่วยสอนการไตร่ตรอง Java
สิ่งที่คุณต้องรู้เกี่ยวกับกลไกการสะท้อนชวา
หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!