2011-08-10 8 views
41

का उपयोग कर स्थिर वर्ग नेस्ट मैं एक nested static class की तरह है:का दृष्टांत Class.forName

package a.b 
public class TopClass { 

    public static class InnerClass { 
    } 
} 

मैं Class.forName() साथ दृष्टांत करना चाहते हैं लेकिन यह एक ClassNotFoundException को जन्म देती है।

Class.forName("a.b.TopClass"); // Works fine. 
Class.forName("a.b.TopClass.InnerClass"); // raises exception 

TopClass.InnerClass instance = new TopClass.InnerClass(); // works fine 

मेरे कोड में क्या गलत है?

उडो।

+3

'कक्षा .forName (" abTopClass $ InnerClass ");' –

+1

... लेकिन अगर आप इससे बच सकते हैं तो कृपया न करें। –

उत्तर

67

नेस्टेड कक्षाएं विभाजक के रूप में "$" का उपयोग करें:

Class.forName("a.b.TopClass$InnerClass"); 

इस तरह JRE डॉट्स का उपयोग कर सकते हैं, संकुल निर्धारित करने के लिए नेस्ट कक्षाओं के बारे में चिंता किए बिना। यदि आप जेनरेट की गई क्लास फ़ाइल देखते हैं, तो आप इसे स्पॉट करेंगे, जो TopClass$InnerClass.class होगा।

(संपादित करें:। मूल अशुद्धि प्रमुख नेट देश में फंस गया था जब तक मैं फ़ाइल नाम के बारे में सोचा ... के लिए क्षमा याचना)

18

कोशिश

Class.forName("a.b.TopClass$InnerClass");

+1

+1, आप सही उत्तर देने वाले पहले व्यक्ति थे – Bozho

8

इनर कक्षाएं डॉलर के माध्यम से पहुंचा जा सकता है साइन इन करें:

Class.forName("a.b.TopClass"); 
Class.forName("a.b.TopClass$InnerClass"); 
1

आंतरिक कक्षा हमेशा डॉलर संकेत के माध्यम से उपयोग की जाती है क्योंकि जब जावा कंपाइलर जावा स्रोत कोड फ़ाइल संकलित करता है I टी उत्पन्न करता है। क्लास फ़ाइल (बाइट कोड)।

उदाहरण के लिए केवल एक वर्ग है Hello.java और यह वर्ग एक बाहरी वर्ग है तो संकलन पर जावा कंपाइलर हैलो.क्लास फ़ाइल उत्पन्न करता है लेकिन यदि इस वर्ग में एक आंतरिक वर्ग हैलोइनर है तो जावा कंपाइलर डी हैलो $ हैलोइनर उत्पन्न करता है। कक्षा (बाइट कोड)।

तो बाईटकोड हमेशा नाम Outer.java साथ स्निपेट के लिए दिखाई देता है:

public class Outer 
    { 
    public var;//member variable 
     Outer()//constructor 
     { 
     } 
     class Inner1 
     { 
      class Inner2 
      { 
       } 
     } 
     } 

तो बाइट कोड है: आउटर $ Inner1 $ Inner2.class

है यही कारण है कि हम $ का उपयोग आंतरिक कक्षा तक पहुंचने के लिए साइन इन करें। :)

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