2010-04-16 15 views
6

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

Class clas = Class.forName(Private.class.getName()); 

    for(Constructor c : clas.getDeclaredConstructors()){ 
     c.setAccessible(true); 
     Private p = (Private) c.newInstance(); 
     System.out.println(p); 
    } 

मैं इसे कैसे प्रतिबंधित कर सकता हूं? ।

धन्यवाद जम्मू

+0

आह एकमात्र के दर्द .. –

+2

यह भी देखें: http://stackoverflow.com/questions/2481862/how-to-limit-setaccessible-to-only-legitimate-uses – polygenelubricants

उत्तर

6

एक SecurityManager का उपयोग करने और नियंत्रित करने ReflectPermission("suppressAccessChecks") (example) नियंत्रित करके।

सुरक्षा प्रबंधक हालांकि प्रदर्शन को प्रभावित करता है, और सर्वर सर्वर पर इसका शायद ही कभी उपयोग किया जाता है।

+0

[कितना बड़ा है प्रदर्शन प्रभाव?] (http://stackoverflow.com/questions/14903423/security-manager-rarely-used-on-server) –

0

लंबी कहानी लघु: आप नहीं कर सकते हैं।

कोई भी कन्स्ट्रक्टर, सार्वजनिक और निजी, प्रतिबिंब द्वारा उपयोग किया जा सकता है और इसे एक नई वस्तु को तुरंत चालू करने के लिए उपयोग किया जा सकता है।

आपको SecurityManager जैसी अन्य विधियों का सहारा लेना होगा।

0

मुझे नहीं लगता कि आप इसे प्रतिबंधित कर सकते हैं।

यह स्पष्ट रूप से एक खतरनाक/संदिग्ध दूसरों (हिनहिनाहट) के गुप्तांगों तक पहुँचने के लिए प्रतिबिंब का उपयोग करने के अभ्यास है, लेकिन यह उपकरण और अनुप्रयोगों के विभिन्न प्रकार के द्वारा कभी कभी आवश्यक है।

1

आप विशेष रूप से एकमात्र के बारे में बात कर रहे हैं:

public enum YourSingleton { 
    INSTANCE; 
    // methods go here 
} 

आप सामान्य रूप में setAccessible() उपयोग के बारे में बात कर रहे हैं: कि एक कारण है कि सबसे अच्छा तरीका उन्हें लागू करने की है एक enum के माध्यम से है कोड हैं किसी ऐसे व्यक्ति द्वारा लिखा जाता है जिसे आप भरोसा नहीं करते हैं कि इस तरह की अंडरहेड चाल न करें, आपको इसे किसी भी तरह से नहीं चलाया जाना चाहिए (या इसे सैंडबॉक्स में चलाएं)। डेवलपर्स में, सार्वजनिक/निजी को इस बारे में मेटाफॉर्मेशन माना जाना चाहिए कि कोड का उपयोग कैसे किया जाना है - सुरक्षा सुविधा के रूप में नहीं।

0

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

0

आप ऐसा कर सकते हैं।

private static final Private INSTANCE = new Private(); 
    private Private() { 
     if(INSTANCE !=null) 
      throw new IllegalStateException("Already instantiated"); 
    } 
    public static Private getInstance() { 
      return INSTANCE; 
     } 
+0

सिंगलटन किसी तीसरे पक्ष के जार में अपनी पहुंच के बाहर है। तो यह बिल्कुल मदद नहीं करेगा। यह तकनीक सुरक्षित तरीके से नहीं है, क्योंकि आप इसे प्रतिबिंब के माध्यम से बदल सकते हैं (जैसा कि प्रश्न में उल्लिखित है)। – whiskeysierra

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