โมดิprivate
ฟายเออร์ใช้เพื่อ จำกัด การเข้าถึงภายนอกคลาส แต่การใช้การสะท้อนคลาสอื่น ๆ สามารถเข้าถึงเมธอดและฟิลด์ส่วนบุคคลได้ ดังนั้นฉันจึงสงสัยว่าเราจะ จำกัด การเข้าถึงได้อย่างไรถ้ามันเป็นส่วนหนึ่งของข้อกำหนด
โมดิprivate
ฟายเออร์ใช้เพื่อ จำกัด การเข้าถึงภายนอกคลาส แต่การใช้การสะท้อนคลาสอื่น ๆ สามารถเข้าถึงเมธอดและฟิลด์ส่วนบุคคลได้ ดังนั้นฉันจึงสงสัยว่าเราจะ จำกัด การเข้าถึงได้อย่างไรถ้ามันเป็นส่วนหนึ่งของข้อกำหนด
คำตอบ:
วัตถุประสงค์ของการปรับเปลี่ยนการเข้าถึงคือการแจ้งให้นักพัฒนาเขียนรหัสเกี่ยวกับอินเทอร์เฟซสาธารณะของคลาส พวกเขาไม่ได้เป็นมาตรการรักษาความปลอดภัยและพวกเขาไม่ได้ซ่อนหรือรักษาความปลอดภัยข้อมูลใด ๆ
ในการอ้างอิงHerb Sutter เกี่ยวกับสิทธิ์การเข้าถึงระดับ :
"ปัญหาในที่นี้คือการปกป้อง Murphy vs. การป้องกัน Machiavelli ... นั่นคือการป้องกันการใช้ในทางที่ผิดโดยไม่ตั้งใจ (ซึ่งภาษาทำได้ดีมาก) เทียบกับการป้องกันการละเมิดโดยเจตนา (ซึ่งเป็นไปไม่ได้อย่างมีประสิทธิภาพ) ในท้ายที่สุดถ้า โปรแกรมเมอร์ต้องการแย่มากพอที่จะล้มล้างระบบเขาจะหาทาง "
#define private public
(ไม่สนใจว่ามันเป็นพฤติกรรมที่ไม่ได้กำหนดจริง ๆ ) และ voila ฉันมีสิทธิ์เข้าถึงเต็มรูปแบบจากภายนอกสู่ส่วนที่จำกัดของชั้นเรียนของคุณ
ไม่นี่เป็นข้อได้เปรียบที่สำคัญ เพียงเพราะนักพัฒนาซอฟต์แวร์บางคนไม่คิดว่าใครจะต้องเข้าถึงสถานะภายในบางส่วนไม่ได้หมายความว่าจะไม่มีกรณีการใช้งานที่ถูกกฎหมายเกิดขึ้น ในกรณีเหล่านี้การใช้ Reflection เพื่อทำการผ่าตัดบนวัตถุอาจเป็นทางเลือกสุดท้าย ฉันต้องใช้เทคนิคนี้มากกว่าหนึ่งครั้ง
คุณ จำกัด การเข้าถึงได้มากขึ้นโดยการเพิ่มขึ้นอีกระดับ: สภาพแวดล้อมการดำเนินการ
ไม่ใช่ทุกภาษาที่มีแนวคิดนี้ แต่อย่างน้อยก็ด้วย Java คุณสามารถใช้ตัวจัดการความปลอดภัยที่ห้ามไม่ให้ฟิลด์ส่วนบุคคลเข้าถึงได้ คุณสามารถติดตั้งตัวจัดการความปลอดภัยด้วยตนเองในขณะรันไทม์หรือเพิ่มนโยบายความปลอดภัยในไฟล์ jar ซึ่งถูกผนึกไว้เพื่อป้องกันการแก้ไข
ข้อมูลเพิ่มเติมเกี่ยวกับการทำเช่นนี้ใน Java: Reflection Security
คุณกำลังพูดถึงเรื่องอะไร
ในหลายระบบการสะท้อนการหลีกเลี่ยงการห่อหุ้มนั้นเป็นความสามารถที่ชัดเจนซึ่งโค้ดของคุณจำเป็นต้องได้รับและไม่มีค่าเริ่มต้น
หากคุณกังวลเกี่ยวกับการห่อหุ้มวิธีแก้ปัญหาง่ายๆคือการไม่ใช้ระบบการสะท้อนที่ไม่ได้เก็บรักษาไว้
ใน Python ไม่มีตัวดัดแปลงการเข้าถึง การประชุมคือการใส่คำนำหน้าโดยขีดเส้นใต้วิธีการและตัวแปรที่ไม่คาดว่าจะสามารถเข้าถึงได้จากนอกชั้นเรียน ในทางเทคนิคแล้วมันเป็นการป้องกันไม่ให้คุณเข้าถึงฟิลด์ดังกล่าวจากคลาสบุคคลที่สามหรือไม่? ไม่ใช่เลย; แต่ถ้าคุณทำคุณจะอยู่คนเดียวและเสี่ยงต่อการทำลายบางสิ่งโดยไม่สามารถตำหนิชั้นเรียนอื่นได้
ใน C # มีตัวดัดแปลงการเข้าถึงอยู่ แต่ยังเป็นเพียงแบบแผน - ข้อหนึ่งซึ่งถูกบังคับใช้โดยคอมไพเลอร์ แต่ยังคงเป็นแบบแผน ซึ่งหมายความว่าในทางเทคนิคเราสามารถเข้าถึงและเปลี่ยนตัวแปรส่วนตัวได้ไม่ว่าจะผ่านทาง Reflection หรือโดยการดัดแปลงหน่วยความจำโดยตรง (เช่นผู้ฝึกสอนเกม ) ผลลัพธ์จะเหมือนกันทุกประการ: หากตัวแปรในชั้นเรียนของคุณเปลี่ยนไปจากการสะท้อนจากชั้นเรียนอื่นหรือผ่านทางหน่วยความจำที่ดัดแปลงโดยแอปพลิเคชั่นอื่นและมันแบ่งบางอย่างในชั้นเรียนของคุณ
โปรดทราบว่าสิ่งนี้จะสร้างปัญหาด้านความปลอดภัยที่บุคคลที่สามสามารถเข้าถึงข้อมูลของคุณได้ สิ่งที่นำไปสู่ตัวแปรที่เข้ารหัสของสตริงและโครงสร้างข้อมูลที่คล้ายกัน แต่การปกป้องรหัสของคุณจากการใช้งานดังกล่าวนั้นเกี่ยวข้องกับระบบปฏิบัติการและข้อ จำกัด การเข้าถึงระดับรหัสมากขึ้นและไม่เกี่ยวข้องกับ Reflection ต่อ se