2011-08-10 21 views
41

mam nested static class jak:instancji zagnieżdżonych klasy statycznej przy użyciu Class.forName

package a.b 
public class TopClass { 

    public static class InnerClass { 
    } 
} 

chcę instancję z Class.forName() ale podnosi ClassNotFoundException.

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

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

Co jest nie tak w moim kodzie?

Udo.

+3

'Class.forName (" abTopClass $ InnerClass ");' –

+1

... ale nie rób tego, jeśli możesz tego uniknąć. –

Odpowiedz

67

Klasy zagnieżdżone użyć „$” jako separator:

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

W ten sposób JRE można używać kropki do określenia pakietów, bez martwienia się o zagnieżdżonych klas. Zobaczysz to, jeśli spojrzysz na wygenerowany plik klasy, który będzie TopClass$InnerClass.class.

(EDIT:. Przeprosiny dla oryginalnego niedokładności szef utknął w .NET ziemi aż myślałem o nazwach ...)

18

spróbować

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

+1

+1, jako pierwszy podałeś prawidłową odpowiedź – Bozho

8

Klasy wewnętrzne są dostępne za pośrednictwem dolara znak:

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

Klasa wewnętrzna jest zawsze dostępna za pośrednictwem znaku dolara, ponieważ gdy kompilator Java kompiluje plik kodu źródłowego java i t generuje plik .class (kod bajtowy).

jeśli istnieje tylko jedna klasa, na przykład Hello.java i ta klasa jest klasą zewnętrzną, to kompilator java na kompilacji generuje plik Hello.class, ale jeśli ta klasa ma klasę wewnętrzną HelloInner, to kompilator java generuje d Hello $ HelloInner. klasa (kod bajtowy).

bajtowego tak zawsze wygląda na następujący fragment z nazwą Outer.java:

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

kod bajtowy jest tak: Outer $ Inner1 $ Inner2.class

dlatego używamy $ Zaloguj się, aby uzyskać dostęp do wewnętrznej klasy. :)

Powiązane problemy