บางครั้งคุณรู้ว่ามีอะไรอยู่ในวัตถุนี้ แต่ด้วยเหตุผลหลายประการคุณไม่สามารถแปลงเป็นวัตถุได้ คุณแค่ต้องการแยกบางสิ่งออกจากวัตถุนี้ คุณต้องใช้การสะท้อนในเวลานี้
หากชั้นเรียนของคุณเป็นแบบนี้:
ผู้ใช้คลาสส่วนตัว {string username; string userpassword; สตริงสาธารณะ getUserName () {return username;} โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้;} สตริงสาธารณะ getUserPassword () {return userPassword;เราใหม่กำหนดค่าและเปลี่ยนเป็นวัตถุ
ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setUserName ("Xu Fenglai"); user.setUserPassword ("15966666"); Object Object = ผู้ใช้;รับชื่อแอตทริบิวต์และบันทึกไว้ในอาร์เรย์
java.lang.reflect.field [] ฟิลด์ = object.getClass (). getDeclaredFields (); สำหรับ (java.lang.reflect.field f: ฟิลด์) {log.i ("xbh", f.getName ());}เอาท์พุท
12-17 12: 02: 10.199 22949-22949/com.example.wechat i/xbh: นี่ $ 0
12-17 12: 02: 10.199 22949-22949/com.example.wechat I/XBH: ชื่อผู้ใช้
12-17 12: 02: 10.199 22949-22949/com.example.wechat i/xbh: userpassword
12-17 12: 02: 10.199 22949-22949/com.example.wechat i/xbh: $ เปลี่ยน
12-17 12: 02: 10.199 22949-22949/com.example.wechat i/xbh: serialversionuid
คุณจะเห็นว่าชื่อแอตทริบิวต์ทั้งสองที่เรากำหนดปรากฏขึ้นและอีกสามชื่อรวมอยู่โดยไม่ต้องกังวลเกี่ยวกับพวกเขา
รับค่าแอตทริบิวต์ก่อนอื่นรับเมธอดจากนั้นรับมันโดยเรียกวิธีการรับ
java.lang.reflect.method [] method = object.getClass (). getDeclaredMethods (); // รับวิธีการทั้งหมดสำหรับ (java.lang.reflect.method m: วิธี) {ระบบ <em> out </em> .println (M.GetName ()); if (m.getName (). startswith ("get")) {object o = null; ลอง {o = m.invoke (วัตถุ); } catch (unglemalAccessException | InvocationTargetException e) {E.PrintStackTrace (); } if (o! = null &&! "". equals (o.toString ())) {log.i ("xbh", o.toString ()); - เอาท์พุท
12-17 12: 09: 33.429 29677-29677/com.example.wechat i/xbh: xu fenglai
12-17 12: 09: 33.429 29677-29677/com.example.wechat I/XBH: 1596666
ว่าถ้าคำสั่งเป็นวิธีการเริ่มต้นของการรับ
เรียกใช้ในการลองใช้วิธีนี้และนำค่าส่งคืนลงใน O
ไม่ได้รับค่าแอตทริบิวต์ผ่านวิธีการรับ
java.lang.reflect.field fi = null; // รับแอตทริบิวต์ลอง {fi = object.getClass (). getDeclaredField ("ชื่อผู้ใช้");} catch (nosuchfieldexception e) {e.printstacktrace () {log.i ("xbh", fi.get (object) .toString ());} catch (ungloralAccessException e) {e.printStackTrace ();}; เอาท์พุท
12-17 12: 17: 34.419 4732-4732/com.example.wechat i/xbh: xu fenglai
คุณสามารถรับได้โดยตรงผ่านวิธี getDeclaredField (โปรดทราบว่ามันแตกต่างจากวิธี getDeclaredFields ด้านบน) แต่ถ้าแอตทริบิวต์ของคุณเป็นส่วนตัวคุณจะไม่สามารถเข้าถึงได้อย่างแน่นอนดังนั้นคุณสามารถเข้าถึงได้โดยการตั้งค่าแอตทริบิวต์นี้เป็นสาธารณะ (setAccessible)
นอกจากนี้หากคุณได้รับข้อมูล JSON คุณไม่จำเป็นต้องแยกวิเคราะห์วัตถุเพียงแค่แปลงเป็นแผนที่
ตัวอย่างเช่น
{"รหัส": 0, "รายการ": [{"ชื่อผู้ใช้": "3294727437", "UserPassword": "xbh1", "useravatar": "https://img1.imgtn.bdimg.com/it/u003d3746072727
คุณจะได้รับคอลเลกชันต่อไปนี้ผ่าน JsonArray ("รายการ") จากนั้นรับวัตถุเดียวผ่าน Get (i) ในความเป็นจริงวัตถุที่เริ่มต้นถูกแปลงเป็นแผนที่ดังนั้นตรวจสอบอย่างระมัดระวัง ดังนั้นจึงไม่จำเป็นต้องสะท้อนและรับคุณลักษณะ คุณสามารถแปลงเป็นแผนที่โดยตรงเพื่อดึงข้อมูล
ชอบ
แผนที่ <string, string = "" map = (แผนที่ <string, string = "">) u; map.get ("useravatar"); </string,> </string,>สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการสะท้อน Java เพื่อรับการแยกวิเคราะห์รหัสแอตทริบิวต์ของวัตถุ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!