2015-11-23 6 views
6

मैं कक्षाओं के बारे में सोच रहा हूं, और विशेष रूप से अज्ञात आंतरिक कक्षाओं के बारे में सोच रहा हूं। इससे मुझे आश्चर्य हुआ कि अज्ञात आंतरिक वर्ग का उपयोग प्रकार क्या है?अज्ञात आंतरिक वर्ग का उपयोग प्रकार क्या है?

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

मैं इस सवाल (इस समस्या का एक उदाहरण) मिला: access exception when invoking method of an anonymous class using java reflection

और यह जवाब जिससे पता चलता है यह निजी है लेकिन लेखक की पुष्टि करने में असमर्थ था: https://stackoverflow.com/a/2659647/3049628

+0

मैं सवाल है कि आप बोली वर्ग पर ही ज्यादा प्रकाश डाला नहीं है लगता है। त्रुटि एक बग के कारण है, और बग विधि की पहुंच के बारे में है, वर्ग नहीं। कक्षा स्वयं सदस्य नहीं है, और इसलिए इसके लिए "पहुंच" व्यर्थ है। – RealSkeptic

उत्तर

4

ऐसा लगता है कि वे सार्वजनिक कर रहे हैं , लेकिन जेडीके के Method.invoke कार्यान्वयन में एक (लंबी चल रही) बग है। bug 4071957 देखें।

जुड़ा हुआ बग वास्तव में हमारी स्थिति से मेल नहीं खाता है, हालांकि यह आंतरिक वर्गों पर सभी प्रकार की Method.invoke एक्सेस कंट्रोल समस्याओं को जोड़ता है और bug 4819108 के डुप्लिकेट के रूप में चिह्नित किया गया था जो आपके द्वारा उल्लेखित SO प्रश्न के स्वीकृत उत्तर में जुड़ा हुआ था ।

+1

व्हाउ, 'सबमिट दिनांक: 1997-08-14' (!!) – Tgsmith61591

+0

हाँ, ऐसा लगता है कि वे जावा 1.1 के बाद से क्लासफ़ाइल प्रारूप को बदलना चाहते हैं, जो इस समस्या को ठीक करने में मदद करेगा। इसे 2014 में अपडेट किया गया है, इसलिए हो सकता है कि उन्होंने इसे पूरी तरह से करने की पूरी आशा नहीं छोड़ी है ... – Aaron

3

class में बाहरी वर्ग का पैकेज लगता है।

getModifiers() मूल्य, 8 है जो टिप्पणियों के अनुसार है: static, package private

इसका static (क्यों?)। मैं Main में अज्ञात वर्ग के अंदर से Main.this का संदर्भ नहीं दे सकता।

इसकी package private। फिर भी, किसी अज्ञात वर्ग के एक्सेस स्तर का अर्थ भी बहुत अधिक नहीं है, क्योंकि आप सामान्य प्रकार की तरह संकलन समय पर अपने प्रकार का उपयोग नहीं कर सकते हैं।

https://ideone.com/vzbdQ5

// JDK 8 
import java.lang.reflect.Modifier; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     Class anon = new Main() {}.getClass(); 

     System.out.println("Name:" + anon.getName()); // Main$1 
     System.out.println("Anonymous:" + anon.isAnonymousClass()); // true 
     System.out.println("Package:" + anon.getPackage()); // null 

     System.out.println("public ? " + Modifier.isPublic(anon.getModifiers())); // false 
     System.out.println("private ? " + Modifier.isPrivate(anon.getModifiers())); // false 
     System.out.println("protected ? " + Modifier.isProtected(anon.getModifiers())); // false 

     assert anon.newInstance() instanceof Main; 
     assert Class.forName(anon.getName()).newInstance() instanceof Main; 
    } 
} 
+0

@assylias धन्यवाद। फिर से परीक्षण किया गया, एनन कक्षा में बाहरी वर्ग के समान पैकेज है। –

+0

मुझे लगता है कि यह केवल स्थिर है क्योंकि इसे एक स्थिर विधि में घोषित किया गया है। किसी अन्य विधि में, यह स्थिर नहीं होगा। चूंकि यह "पैकेज निजी" है - यह वास्तव में केवल डिफ़ॉल्ट है, जिसे "पैकेज निजी" के रूप में व्याख्या किया जाता है। लेकिन यह वर्ग * के लिए व्यर्थ है जो न तो सदस्य है और न ही शीर्ष-स्तर * है। – RealSkeptic

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