2011-04-29 20 views
14

Tengo el siguiente código de Java:¿Cómo cargar clases anidadas en Java?

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 
    } 
} 

¿Por qué no class.forName("Test") trabajo aquí, mientras que la línea siguiente funciona bien?

+0

Sólo para fijar la terminología correcta, no hay nada como una clase interna estática. Has anidado las clases: estático y no estático (interno). – Swapnil

Respuesta

28

Uso Outer$Nested (sin tener en cuenta si la clase anidada es estática o no)

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

Debe utilizar el nombre de clase totalmente calificado, es decir, yourpackage.CheckInnerStatic$Test (suponiendo que haya definido un paquete, de lo contrario omita esa parte).

+0

Lamento decirlo pero parece que tampoco funciona, ¿me equivoco? Además, ¿cómo puedo crear una instancia de la clase de prueba sin dar el nombre completo como me dijo, pero no puedo cargarlo? – Vivek

+0

Use 'yourpackage.CheckInnerStatic $ Test'. El signo $ se usa para calificar las clases internas. –

+0

por favor actualice su respuesta. Necesita usar $ character en lugar de dot para cargar la clase interna. –

6
Class innerClass = Class.forName("com.foo.OuterClass$InnerClass"); 
Cuestiones relacionadas