2012-02-20 22 views
17

क्या कोई परिस्थिति है जिसमें Class.getDeclaringClassClass.getEnclosingClass से भिन्न परिणाम दे सकता है?वर्ग बनाम कक्षा

मैंने सोचा कि यह बाहरी कक्षा एक आंतरिक वर्ग कि स्थिर के रूप में घोषित नहीं किया गया था instantiating के उपवर्ग से कोई लेना देना हो सकता है, लेकिन मैं एक अंतर यह है कि जिस तरह से प्राप्त करने में सक्षम नहीं था:

public class Main { 
    private static class StaticInnerClass { 

    } 

    private class MemberInnerClass { 

    } 

    private static class ChildClass extends Main { 

    } 

    public MemberInnerClass getMemberInnerClassInstance() { 
    return new MemberInnerClass(); 
    } 

    public static void main(String[] args) { 
    System.out.println(StaticInnerClass.class.getDeclaringClass()); 
    System.out.println(StaticInnerClass.class.getEnclosingClass()); 
    System.out.println(MemberInnerClass.class.getDeclaringClass()); 
    System.out.println(MemberInnerClass.class.getEnclosingClass()); 
    System.out.println(new ChildClass().getMemberInnerClassInstance().getClass().getEnclosingClass()); 
    System.out.println(new ChildClass().getMemberInnerClassInstance().getClass().getDeclaringClass()); 
    } 
} 

आउटपुट :

class Main 
class Main 
class Main 
class Main 
class Main 
class Main 
+0

क्या उद्देश्य है ? – MartinL

+0

@ मार्टिनएल: मेरे पास एक वर्ग 'एक्स' है जो मेरे उदाहरण की शब्दावली में' सदस्य इंटर्न क्लास 'घोषित करता है। मेरे पास 'X' की बड़ी संख्या में उप-वर्ग भी हैं। मुझे यह निर्धारित करने की संभावित आवश्यकता थी कि' एक्स 'सदस्यइनर क्लास' के दिए गए उदाहरण के लिए शामिल था; मैंने काम किया है इस समय चारों ओर एड करें लेकिन बनाम संलग्न वर्ग घोषित करने के बारे में उत्सुक था। – OpenSauce

उत्तर

24

यहाँ http://kickjava.com/1139.htm#ixzz1mv2nEWg7 मिला:

"getDeclaringClass साथ धूर्तता अनाम इनर क्लासों वें में एक वर्ग के सदस्य के रूप में नहीं गिने जाते हैं है ई जावा भाषा विशिष्टता जबकि आंतरिक कक्षाएं नामित हैं। इसलिए यह विधि अज्ञात वर्ग के लिए शून्य हो जाती है। वैकल्पिक पद्धति getEnclosingClass दोनों अनाम और नामित वर्गों के लिए काम करता है "

उदाहरण के लिए:।

public class Test { 
    public static void main(String[] args) { 
     new Object() { 
      public void test() { 
       System.out.println(this.getClass().getDeclaringClass()); //null 
       System.out.println(this.getClass().getEnclosingClass()); //not null 
      } 
     }.test(); 
    } 
} 

ही एक विधि दायरे में गैर-अनाम कक्षाओं के लिए रखती है:

class Foo { 
    Class<?> bar() throws NoSuchFieldException { 
    class Bar<S> { } 
    return Bar.class; 
    } 

    static void main(String[] args) throws NoSuchFieldException { 
    System.out.println(new Foo<Void>().bar().getDeclaringClass()); // null 
    System.out.println(new Foo<Void>().bar().getEnclosinglass()); // Foo 
    } 
} 
संबंधित मुद्दे