2011-12-16 28 views
7

के साथ सुरक्षा बनाम संरक्षित सुरक्षा मैं आंतरिक संरक्षित वर्ग को तुरंत चालू करने के लिए प्रतिबिंब का उपयोग क्यों कर सकता हूं, लेकिन पैकेज-स्तर सुरक्षा के साथ आंतरिक कक्षा नहीं? मुझे नहीं लगता कि या तो पैकेज के बाहर सुलभ होगा।पैकेज बनाम जावा प्रतिबिंब

package dummy; 

public class ClassContainer { 
    protected static class InnerProtected { 
     public InnerProtected() {} 
    } 

    static class InnerDefault { 
     public InnerDefault() {} 
    } 

    private class InnerPrivate { 
     public InnerPrivate() {} 
    } 
} 


package driver; 

public class DriverClass { 

    public static void main(String[] args) throws Exception { 
     Class.forName("dummy.ClassContainer$InnerProtected").newInstance(); 
     Class.forName("dummy.ClassContainer$InnerDefault").newInstance(); 
     Class.forName("dummy.ClassContainer$InnerPrivate").newInstance(); 
    } 
} 

सूचना है कि दो वर्गों विभिन्न संकुल में कर रहे हैं:

निम्न उदाहरण पर विचार करें।

मुख्य में पहली पंक्ति (जो इनरप्रोक्टेक्टेड को तत्काल करता है) काम करता है।

दूसरी पंक्ति (जो InnerDefault को दर्शाता है) इस अपवाद फेंकता है:

Exception in thread "main" java.lang.IllegalAccessException: Class driver.DriverClass can not access a member of class dummy.ClassContainer$InnerDefault with modifiers "public" 

चालक के बाद से एक वर्ग परिभाषाओं से एक अलग पैकेज है, नहीं करना चाहिए instantiating कक्षाएं असफल पर ये दोनों ही प्रयास?

(के लिए क्या इसके लायक है: InnerPrivate विफल रहता है के रूप में मैं उम्मीद करेंगे दृष्टांत करने का प्रयास:।

Exception in thread "main" java.lang.InstantiationException: dummy.ClassContainer$InnerPrivate 
+0

दिलचस्प सवाल। यह जावा बग या वास्तव में एक गूढ़ डिजाइन निर्णय की तरह गंध करता है। – Nayuki

उत्तर

4

वास्तव में, javap रिपोर्ट है कि InnerProtectedpublic के रूप में संकलित किया गया है, जबकि अन्य सदस्य वर्गों पैकेज-निजी हैं

मेरा मानना ​​है कि यह विभिन्न पैकेजों से ClassContainer के उप-वर्गों को दृश्यमान करने की आवश्यकता के कारण होता है। शायद वीएम इस मामले में एक्सेस कंट्रोल नियमों को संभाल नहीं सकता है, ताकि उन्हें कंपाइलर स्तर पर संभाला जा सके।

नोट, हालांकि, यदि आप इन कक्षाओं के लिए कंडक्टर घोषणाएं छोड़ देते हैं तो उनके जेनरेट किए गए रचनाकारों की अपेक्षाकृत दृश्यताएं होती हैं, जो protected, डिफ़ॉल्ट और private क्रमशः है।

+1

हां, जेडीके 1.00 में 'संरक्षित' कक्षाएं नहीं हैं, इसलिए कक्षा फाइलें या तो नहीं हैं। आपको यह पता होना चाहिए कि आप एक ही पैकेज से निजी, और यहां तक ​​कि स्थानीय आंतरिक कक्षाओं तक पहुंच सकते हैं। –

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