2015-10-16 6 views
8

प्रतिबिंब का उपयोग करते समय मुझे देखने के लिए संभावित मुद्दों क्या हैं। मैं प्रतिबिंब में बहुत उलझन में हूं, क्यों जावा निजी डेटा सदस्य तक पहुंचने के लिए इस प्रकार की कार्यक्षमता प्रदान करता है।निजी निजी है, तो क्यों जावा प्रतिबिंब का उपयोग कर निजी विधि तक पहुंचने की सुविधा देता है?

निजी: की तरह मुझे लगता है कि चाहते हैं, केवल वर्ग है जिसमें यह घोषित किया जाता है देख सकते हैं।

फिर ऐसा क्यों है अन्य वर्ग में निजी चीजों का उपयोग करने के लिए संभव है? इस शब्दावली (प्रतिबिंब) जावा में निजी (एक्सेस विशिष्ट) गुणों की पूरी अवधारणा को पूरी तरह से बहती है।

मैं इस विषय के बारे में कई लिंक आए थे, लेकिन इस विषय के बारे में पूर्ण विवरण नहीं दिया। उदाहरण:

package example; 

import java.lang.reflect.Method; 

class A{ 
    private void privateMethod(){ 
     System.out.println("hello privateMethod()"); 
    } 
} 
class B{ 
    public static void main(String[] args) throws Exception { 
     A d = new A(); 
     Method m = A.class.getDeclaredMethod("privateMethod");  
     m.setAccessible(true); 
     m.invoke(d); 
    } 
} 

तो कृपया गहराई से इस दृष्टिकोण के बारे में परिदृश्य बताएं? मुझे अन्य वर्गों में निजी तरीकों की पहुंच के लाभ और नुकसान की आवश्यकता है?

+11

http://stackoverflow.com/questions/1239581/why-is-it-allowed-to-access-java-private-fields-via-reflection –

+1

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

+0

कोई भी उदाहरण के साथ समझा सकता है? क्योंकि यह मेरी अवधारणा के बारे में बहुत स्पष्ट होगा। –

उत्तर

1

सभी "निजी" और घोषणा के अन्य रूपों हैं, विकास उपकरण के लिए झंडे हैं इतना है कि यह जानता है कि कैसे आप सवाल में क्षेत्र या विधि का उपयोग करना चाहते हैं। ऐसा इसलिए है जब विकास उपकरण डेवलपर को चेतावनियां या त्रुटियां दे सकता है जब वे इन वर्गों/फ़ील्ड/तरीकों का उपयोग इस तरह से नहीं करते थे।

प्रतिबिंब एक उपकरण डेवलपर उपेक्षा या जो इंगित करता है कि आप एक तरह से यह कभी नहीं करना था में वर्ग/क्षेत्र/विधि का उपयोग कर रहे इन चिह्नों को नाकाम कर देता है जो है। तो सामान्य प्रतिबिंब में खराब वास्तुकला दिखाता है।

तो वहाँ कोई "फायदे या नुकसान" निजी या सार्वजनिक या स्थिर के रूप में कुछ की घोषणा करने के लिए कर रहे हैं; वे केवल आपके कोड को स्वच्छ और विभाजित करने में मदद करने के लिए टूल हैं जो केवल डेवलपर्स को अपने वर्ग/फ़ील्ड/विधियों को विशेष तरीकों से एक्सेस/उपयोग करने की इजाजत देते हैं।

+3

यह गलत है। सुरक्षा प्रबंधक मौजूद होने पर JVM पहुंच-योग्यता (प्रतिबिंबित कार्यवाही अक्षम करना) लागू करेगा। यह कहने के लिए कि यह "बस" संकलन-समय संकेत गलत है; यह सिर्फ सुरक्षा प्रबंधक डिफ़ॉल्ट रूप से सक्षम नहीं है (और एसएम की उपस्थिति में एक ऐप बनाना कठिन है)। इन परावर्तक विशेषताओं का उपयोग कुछ बहुत ही उपयोगी ढांचे, जैसे धारावाहिक-जैसे ढांचे, वितरित ऑब्जेक्ट कैश, दृढ़ता ढांचे, और नकली ढांचे के द्वारा किया जाता है। –

1

अधिकांश स्थितियों में, पहुँच संशोधक मदद करने के लिए अपने कोड के कुछ हिस्सों कि आप लोगों को दृश्य से बाहर के लिए बाध्य नहीं करना चाहती रखने होती हैं। प्रतिबिंब का उपयोग करके निजी तरीकों तक पहुंचने की क्षमता टूलींग परिप्रेक्ष्य से उपयोगी हो सकती है। जावा में एक सुरक्षा तंत्र है जो इस सुविधा को अक्षम करने की अनुमति देता है। यह site प्रतिबिंब (पृष्ठ के नीचे) से संबंधित जावा सुरक्षा मॉडल के बारे में कुछ जानकारी है।

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

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