แม้ว่าเรามักจะคิดว่ามีความเป็นไปได้ที่จะเข้าถึงเขตข้อมูลส่วนตัวและวิธีการส่วนตัวของคลาสอื่น ๆ ผ่านกลไกการสะท้อนกลับของ JAVA แต่ก็ไม่ได้ยากขนาดนั้น
หมายเหตุ: โค้ดนี้จะใช้งานได้เฉพาะเมื่อคุณรันในโปรแกรม Java แยกต่างหาก เช่น คุณทำการทดสอบหน่วยหรือโปรแกรมทั่วไป หากคุณพยายามใช้วิธีนี้ภายใน JAVA APPLET คุณจะต้องแก้ไข SecurityManager เล็กน้อย อย่างไรก็ตาม เนื่องจากคุณไม่จำเป็นต้องจัดการกับมันบ่อยนัก ฉันจะไม่ลงรายละเอียดที่นี่
นี่คือรายการเนื้อหานี้:
1. เข้าถึงฟิลด์ส่วนตัว
2. เข้าถึงวิธีการส่วนตัว
เข้าถึงฟิลด์ส่วนตัว:
ในการเข้าถึงฟิลด์ส่วนตัว คุณต้องเรียกใช้เมธอด Class.getDeclaredField(String name) หรือ Class.getDeclaredFields() เมธอด Class.getField(String name) และ Class.getFields() ส่งคืนเฉพาะฟิลด์ทั่วไปเท่านั้น ดังนั้นจึงไม่มีผลกระทบ นี่คือตัวอย่างของคลาสที่มีฟิลด์ส่วนตัว และใต้คลาสคือโค้ดที่เข้าถึงฟิลด์ส่วนตัวผ่านการสะท้อนกลับ
คัดลอกรหัสรหัส ดังต่อไปนี้:
PrivateObject คลาสสาธารณะ {
สตริงส่วนตัว privateString = null; // ประกาศเป็นฟิลด์ส่วนตัว
สาธารณะ PrivateObject (สตริง privateString) {
this.privateString = สตริงส่วนตัว;
-
-
คัดลอกรหัสรหัส ดังต่อไปนี้:
PrivateObject privateObject = new PrivateObject("The Private Value");//สร้างอินสแตนซ์ของวัตถุ
ฟิลด์ privateStringField = PrivateObject.class
getDeclaredField("privateString");
privateStringField.setAccessible(true);//อนุญาตให้เข้าถึงฟิลด์ส่วนตัว
String fieldValue = (String) privateStringField.get(privateObject);//รับค่าฟิลด์ส่วนตัว
System.out.println("fieldValue = " + fieldValue);
รหัสนี้จะพิมพ์ข้อความ "fieldValue = The Private Value" ซึ่งเกิดขึ้นเป็นค่าของฟิลด์ส่วนตัว privateString ของวัตถุ PrivateObject
โปรดสังเกตว่าเราใช้เมธอด PrivateObject.class.getDeclaredfield("privateString") การเรียกใช้เมธอดนี้จะส่งกลับฟิลด์ส่วนตัว วิธีนี้จะส่งคืนเฉพาะฟิลด์ตามคลาสที่ระบุ และจะไม่ส่งคืนฟิลด์ที่ประกาศโดยคลาสหลัก
ดูข้อความที่เป็นตัวหนาอย่างระมัดระวังด้วย ด้วยการเรียก Field.setAccessible(true) คุณจะปิดการตรวจสอบการเข้าถึงสำหรับอินสแตนซ์ฟิลด์ที่ระบุนี้ ซึ่งจะมีผลกับการสะท้อนเท่านั้น ตอนนี้คุณสามารถเข้าถึงได้ ไม่ว่าจะเป็นแบบส่วนตัว ได้รับการป้องกัน หรือเป็นค่าเริ่มต้น แม้ว่าผู้โทรจะไม่ได้อยู่ในขอบเขตนั้นก็ตาม คุณยังคงไม่สามารถเข้าถึงฟิลด์ด้วยวิธีการปกติได้เนื่องจากคอมไพเลอร์ไม่อนุญาต
การเข้าถึงเมธอดส่วนตัว <BR>เพื่อที่จะเข้าถึงเมธอดส่วนตัว คุณจะต้องเรียกใช้เมธอด Class.getDeclaredMethod(String name,Class[] parameterTypes) หรือ Class.getDeclaredMethods() เมธอด Class.getMethod(String name,Class[] parameterTypes) และ Class.getMethods() ส่งคืนเมธอดสาธารณะเท่านั้น ดังนั้นจึงไม่มีบทบาทใดๆ ด้านล่างนี้เป็นตัวอย่างง่ายๆ ของคลาสที่มีวิธีการส่วนตัว ด้านล่างของคลาสคือโค้ดที่เข้าถึงวิธีการส่วนตัวผ่านการสะท้อนกลับ
คัดลอกรหัสรหัส ดังต่อไปนี้:
PrivateObject คลาสสาธารณะ {
สตริงส่วนตัว privateString = null;
สาธารณะ PrivateObject (สตริง privateString) {
this.privateString = สตริงส่วนตัว;
-
สตริงส่วนตัว getPrivateString(){//วิธีการส่วนตัว
กลับ this.privateString;
-
-
คัดลอกรหัสรหัส ดังต่อไปนี้:
PrivateObject privateObject = new PrivateObject("มูลค่าส่วนตัว");
วิธีการ privateStringMethod = PrivateObject.class
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible (จริง);
สตริง returnValue = (สตริง)
privateStringMethod.inrigg (privateObject, null);
System.out.println("returnValue = " + returnValue);
ตัวอย่างโค้ดนี้พิมพ์ข้อความ "returnValue = The private Value" ซึ่งเป็นค่าตอบแทนของวิธีการส่วนตัว