63 votes

Instancier une classe statique imbriquée à l'aide de Class.forName

J'ai un nested static class comme :

 package a.b
public class TopClass {

    public static class InnerClass {
    }
}

Je veux instancier avec Class.forName() mais cela soulève 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'est-ce qui ne va pas dans mon code ?

Tu fais.

102voto

Jon Skeet Points 692016

Les classes imbriquées utilisent "$" comme séparateur :

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

De cette façon, le JRE peut utiliser des points pour déterminer les packages, sans se soucier des classes imbriquées. Vous le remarquerez si vous regardez le fichier de classe généré, qui sera TopClass$InnerClass.class .

(EDIT : toutes mes excuses pour l'inexactitude d'origine. Head était coincé dans le terrain .NET jusqu'à ce que je pense aux noms de fichiers...)

19voto

Silfverstrom Points 8132

essayer

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

8voto

Arturs Licis Points 2242

Les classes internes sont accessibles via le signe dollar :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X