2011-04-29 14 views
14

मैं निम्नलिखित जावा कोड है:जावा में नेस्टेड कक्षाएं कैसे लोड करें?

public class CheckInnerStatic { 

private static class Test { 
    static { 
     System.out.println("Static block initialized"); 
    } 
    public Test() { 
     System.out.println("Constructor called"); 
    } 
} 

    public static void main (String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
     System.out.println("Inside main"); 
     Class.forName("Test"); // Doesn't work, gives ClassNotFoundException 
     //Test test = new Test(); // Works fine 
    } 
} 

क्यों, जबकि अगली पंक्ति ठीक काम करता है यहाँ नहीं class.forName("Test") काम करता है?

+0

बस शब्दावलियों सही सेट करने के लिए (भले ही कोई नेस्ट वर्ग स्थिर या नहीं है), वहाँ एक स्थिर भीतरी वर्ग की तरह कुछ भी नहीं है। आपने वर्गों को घोंसला दिया है - स्थैतिक और गैर स्थैतिक (आंतरिक)। – Swapnil

उत्तर

28

उपयोग Outer$Nested

public class CheckInnerStatic { 

    private static class Test { 
    static { 
     System.out.println("Static block initialized"); 
    } 
    public Test() { 
     System.out.println("Constructor called"); 
    } 
} 

    public static void main (String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
     System.out.println("Inside main"); 
     Class<?> cls = Class.forName("CheckInnerStatic$Test"); 
     //Test test = new Test(); 
    } 
} 
8

आपको पूरी तरह से योग्य वर्ग नाम, यानी yourpackage.CheckInnerStatic$Test (मान लीजिए कि आपने एक पैकेज परिभाषित किया है, अन्यथा उस भाग को छोड़ दें) का उपयोग करने की आवश्यकता है।

+0

कहने के लिए खेद है, लेकिन यह काम नहीं करता प्रतीत होता है, क्या मैं गलत हूं? साथ ही मैं टेस्ट क्लास को पूर्ण नाम देने के बिना कैसे कर सकता हूं जैसा कि आपने कहा था लेकिन इसे लोड करने में सक्षम नहीं हूं? – Vivek

+0

'yourpackage.checkInnerStatic $ Test' का उपयोग करें। आंतरिक वर्गों को अर्हता प्राप्त करने के लिए $ संकेत का उपयोग किया जाता है। –

+0

कृपया अपना उत्तर अपडेट करें। आंतरिक कक्षा को लोड करने के लिए आपको डॉट के बजाय $ वर्ण का उपयोग करने की आवश्यकता है। –

6
Class innerClass = Class.forName("com.foo.OuterClass$InnerClass"); 
संबंधित मुद्दे