2011-12-23 6 views
7

मैं जावा का उपयोग कर रहा हूं। मुझे निजी एक्सेस संशोधक का उपयोग करके पता है जिसे हम प्रतिबंधित कर सकते हैं। लेकिन प्रतिबिंब API का उपयोग करके मैं कक्षा के बाहर चर का उपयोग कर सकता हूं। फिर यहां निजी संशोधक का उपयोग क्या है?जावा में कक्षा के बाहर पहुंचने के लिए वेरिएबल को प्रतिबंधित कैसे करें?

+0

डिफ़ॉल्ट रूप से आप प्रतिबिंब के माध्यम से निजी क्षेत्रों तक पहुंच सकते हैं? –

+0

हां। और मुझे नहीं लगता कि जावा को "मेरे निजी क्षेत्रों पर कोई प्रतिबिंब नहीं" बताने का एक आसान तरीका है। – user949300

उत्तर

2

क्योंकि प्रतिबिंब encapsulation तोड़ता है। यदि आपका एप्लिकेशन सुरक्षा प्रबंधित वातावरण में चल रहा है तो आप प्रतिबिंब एपीआई के उपयोग को रोक सकते हैं। Java Security Manager

8

private आपको जावा का उपयोग करके अन्य कक्षाओं से इसे एक्सेस करने से रोकता है। हालांकि जेएनआई या पुस्तकालय का उपयोग करके आप चीजों को अलग-अलग कर सकते हैं। आप एक सुरक्षा प्रबंधक के साथ प्रतिबिंब को रोक सकते हैं लेकिन इसकी शायद ही कभी आवश्यकता है।

नोट: सीरियलाइजेशन जैसे कुछ पुस्तकालयों को निजी क्षेत्रों तक काम करने में सक्षम होना चाहिए।

+0

+1। ओपी को, कृपया ध्यान दें कि प्रतिबिंब को रोकने से आपके इंटरऑपरेबिलिटी को कई जावा पुस्तकालयों के साथ तोड़ दिया जाएगा जो आप उपयोग करना चाहते हैं। – Perception

+0

@ धारणा और कुछ चीजें पुस्तकालय प्रतिबिंब के साथ करते हैं (नो-एर्ग कन्स्ट्रक्टर जो मौजूद नहीं हैं, इसलिए अंतिम तोड़ना आदि) आपके कोड में संभावित चरम परिवर्तन हैं। कई बार मैं सिर्फ अपनी आंखें बंद करता हूं और प्रार्थना करता हूं कि वे सही काम कर रहे हैं। :-) – user949300

+0

@ user949300 - निश्चित रूप से। हालांकि, क्या आप कल्पना कर सकते हैं कि हाइबरनेट जैसी लाइब्रेरी प्रतिबिंबित करने और बाइट इंजीनियर वर्गों की क्षमता के बिना कैसा दिखाई देगी? – Perception

1

तो निजी संशोधक यहाँ

private संशोधक एक सुरक्षा तंत्र नहीं है के उपयोग क्या है; यह एक encapsulation तंत्र (एक हिस्सा) है। किसी वस्तु के आंतरिक उपभोग से छिपाने से सार्वजनिक उपभोग से ऑब्जेक्ट्स को एक सतत, प्रयोग योग्य स्थिति में रखने में मदद मिलती है, जबकि ऑब्जेक्ट के कौन से हिस्से सार्वजनिक इंटरफ़ेस लिखते हैं (और बदलने के लिए भरोसा नहीं किया जा सकता है) के बारे में टिप्पणी प्रदान करते हैं।

निश्चित रूप से, उपयोगकर्ता private फ़ील्ड में डेटा तक पहुंचने के लिए प्रतिबिंब का उपयोग कर सकते हैं, लेकिन उन्हें पता चलेगा कि वे ऐसा कुछ कर रहे हैं जो लाइब्रेरी द्वारा समर्थित नहीं है।

0

मैं जावा सुरक्षा सामग्री पर कोई विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आपको अपना स्वयं का सुरक्षा प्रबंधक प्रदान करना होगा और चेकमम्बरएप() को ओवरराइड करना होगा। उदाहरण के लिए, सभी प्रतिबिंब

public void checkMemberAccess(Class<?> clazz, int which) throws AccessControlException { 

     if (which != Member.PUBLIC) { 
      throw new AccessControlException("No reflection on non-public fields allowed"); 
     } 
    } 

को रोकने के लिए जाहिर है, असली दुनिया में, आप केवल पहला तर्क में "महत्वपूर्ण" वर्गों की एक निश्चित सबसेट के लिए जाँच करने के लिए चाहते हो सकता है। और, जैसा कि कई अन्य प्रतिक्रियाओं में उल्लेख किया गया है, इससे कई तृतीय पक्ष पुस्तकालयों के लिए समस्याएं पैदा होंगी।

संबंधित मुद्दे

 संबंधित मुद्दे