2011-08-10 11 views
41

Tengo un nested static class como:Instantiate anidado clase estática usando Class.forName

package a.b 
public class TopClass { 

    public static class InnerClass { 
    } 
} 

que desea crear una instancia con Class.forName() pero plantea un ClassNotFoundException.

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

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

¿Qué hay de malo en mi código?

Udo.

+3

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

+1

... pero no lo hagas si puedes evitarlo. –

Respuesta

67

clases anidadas utilizan "$" como separador:

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

De esa manera el JRE puede utilizar para determinar los puntos paquetes, sin tener que preocuparse acerca de las clases anidadas. Lo detectará si mira el archivo de clase generado, que será TopClass$InnerClass.class.

(EDIT:. Disculpas por la inexactitud originales de la cabeza estaba atrapado en la tierra .NET hasta que pensé acerca de los nombres de archivo ...)

18

tratan se accede

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

+1

+1, usted fue el primero en dar la respuesta correcta – Bozho

8

Las clases internas a través de dólar firmar:

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

clase interna siempre se accede a través de la muestra de dólar porque cuando compilador java compila el archivo de código fuente de java i t genera un archivo .class (código de bytes).

si solo hay una clase, por ejemplo Hello.java y esta clase es una clase externa, entonces el compilador Java en compilación genera el archivo Hello.class pero si esta clase tiene una clase interna HelloInner, el compilador java genera d Hello $ HelloInner. clase (código de bytes).

modo de código de bytes siempre se parece a siguiente fragmento con el nombre Outer.java:

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

código byte es así: Outer $ Inner1 $ Inner2.class

es por eso que utilizamos $ signo para acceder a la clase interna. :)