2011-04-29 5 views
14

J'ai le code java suivant:Comment charger des classes imbriquées 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 
    } 
} 

Pourquoi ne pas le travail class.forName("Test") ici pendant que la ligne suivante fonctionne bien?

+0

Juste pour définir les terminologies droite, il n'y a rien comme une classe interne statique. Vous avez imbriqué des classes - statique et non statique (interne). – Swapnil

Répondre

28

Utilisez Outer$Nested (peu importe si la classe imbriquée est statique ou non)

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

Vous devez utiliser le nom de classe complet, c'est-à-dire yourpackage.CheckInnerStatic$Test (en supposant que vous ayez défini un package, sinon ignorez cette partie).

+0

Désolé de dire mais cela ne semble pas fonctionner non plus, ai-je tort? Comment puis-je instancier la classe Test sans donner le nom complet comme vous l'avez dit mais je ne suis pas capable de le charger? – Vivek

+0

Utilisez 'yourpackage.CheckInnerStatic $ Test'. Le signe $ est utilisé pour qualifier les classes internes. –

+0

s'il vous plaît mettre à jour votre réponse. Vous devez utiliser $ character au lieu de dot pour charger la classe interne. –

6
Class innerClass = Class.forName("com.foo.OuterClass$InnerClass"); 
Questions connexes