2013-04-26 8 views
6

मैं प्रतिबिंब में बहुत नया हूँ और मैं एक संदेह की तरह है:
AccessibleObject क्लास के सेट असफल विधि के पीछे कारण क्या है एक बूलियन पैरामीटर है?

public void setAccessible(boolean flag) throws SecurityException 

यह विधि एक boolen पैरामीटर झंडा है, जो किसी भी फ़ील्ड या तरीकों के नए पहुँच इंगित करता है।
एक उदाहरण के लिए अगर हम कक्षा के बाहर से एक वर्ग का एक private विधि तक पहुँचने का प्रयास कर रहे हैं तो हम विधि getDeclaredMethod का उपयोग कर लाए जाने और true के रूप में पहुँच निर्धारित करते हैं, तो यह की तरह है, लागू किया जा सकता है: method.setAccessible(true);
जो परिदृश्य में अब हमें method.setAccessible(false); का उपयोग करना चाहिए, उदाहरण के लिए इसका उपयोग तब किया जा सकता है जब public विधि हो और हम पहुंच को गलत के रूप में सेट करते हैं। लेकिन इसकी क्या ज़रूरत है? क्या मेरी समझ स्पष्ट है?
यदि वहाँ method.setAccessible(false) का कोई उपयोग नहीं तो हम जैसे विधि हस्ताक्षर बदल सकते हैं:

public void setAccessible() throws SecurityException 
+1

आप एक राज्य में जो कोड के प्रोग्रामर ** इरादा नहीं था में प्रतिबिंब के तहत कोड छोड़ने के लिए नहीं करना चाहती ** । क्या आप ? आपने निरीक्षण के लिए कोड का एक टुकड़ा _unlock_ पर प्रतिबिंब का उपयोग किया है, क्या आप इसे बाद में _unlocked_ छोड़ना चाहते हैं? –

+0

यूप। आपका अंक मिला –

+0

डाउनवोटर क्या आप कृपया एक टिप्पणी दे सकते हैं ताकि मैं अपना प्रश्न सुधार सकूं .. –

उत्तर

5

परिदृश्य: आप के लिए एक निजी क्षेत्र से सुरक्षा हटा दिया Field.setAccessible(true), साथ इसे पढ़ा और Field.setAccessible(false).

साथ मूल राज्य में क्षेत्र लौटे
+9

आप ऐसा कर सकते हैं लेकिन इससे कोई प्रभाव नहीं पड़ता है क्योंकि आप इसे फिर से झूठी सेट करके एक्सेसिबिलिटी की रक्षा नहीं करते हैं क्योंकि कोई क्लाइंट किसी भी समय फ़ील्ड इंस्टेंस प्राप्त कर सकता है और फ़ील्ड का उपयोग करने के लिए फिर से सेट (अक्षम) का उपयोग करें। इसके अलावा सेटएक्सेबल स्थायी रूप से फ़ील्ड की पहुंचता और न ही प्रतिबिंबित तरीके से बदलता है, ताकि आप इसे गैर-रिफ्लेक्शन तरीके से फ़ील्ड का उपयोग करके ग्राहकों से सुरक्षित रख सकें .. – mickeymoon

+0

सहमत हैं, लेकिन हमें हमेशा ऐसा करना है। यहां कोई भी 'झूठा' मूल्य पारित करने वाला नहीं है। तो कोड की एक अतिरिक्त पंक्ति लिखने के लिए भी परेशान क्यों? – Dennis

14

शायद आप अपने पूरे जीवन में कभी भी setAccessible(false) नहीं करेंगे। ऐसा इसलिए है क्योंकि सेटएक्सेबल एक सदस्य की दृश्यता को स्थायी रूप से बदलता नहीं है। जब आप method.setAccessible(true) की तरह कुछ करने के लिए आपको परmethod उदाहरण पर भी अगली कॉल करने की अनुमति है, भले ही मूल स्रोत में विधि निजी है।

उदाहरण के लिए इस पर विचार करें:

A.java 
******* 
public class A 
{ 
    private void fun(){ 
    .... 
    } 
} 

B.java 
*********** 
public class B{ 

    public void someMeth(){ 
     Class clz = A.class; 
     String funMethod = "fun"; 

     Method method = clz.getDeclaredMethod(funMethod); 
     method.setAccessible(true); 

     method.invoke(); //You can do this, perfectly legal; 

     /** but you cannot do this(below), because fun method's visibilty has been 
      turned on public only for the method instance obtained above **/ 

     new A().fun(); //wrong, compilation error 

     /**now you may want to re-switch the visibility to of fun() on method 
      instance to private so you can use the below line**/ 

     method.setAccessible(false); 

     /** but doing so doesn't make much effect **/ 

    } 

}

+0

आपके उत्तर के लिए धन्यवाद। –

+0

आपका स्वागत है :) – mickeymoon

0
//create class PrivateVarTest { private abc =5; and private getA() {sop()}} 


import java.lang.reflect.Field; 
import java.lang.reflect.Method; 

public class PrivateVariableAcc { 

public static void main(String[] args) throws Exception { 
    PrivateVarTest myClass = new PrivateVarTest(); 

    Field field1 = myClass.getClass().getDeclaredField("a"); 

    field1.setAccessible(true); 

    System.out.println("This is access the private field-" 
      + field1.get(myClass)); 

    Method mm = myClass.getClass().getDeclaredMethod("getA"); 

    mm.setAccessible(true); 
    System.out.println("This is calling the private method-" 
      + mm.invoke(myClass, null)); 

} 

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