Instancier une classe statique nestede à l’aide de Class.forName

J’ai une nested static class comme:

 package ab public class TopClass { public static class InnerClass { } } 

Je veux instancier avec Class.forName() mais il déclenche une ClassNotFoundException .

 Class.forName("abTopClass"); // Works fine. Class.forName("abTopClass.InnerClass"); // raises exception TopClass.InnerClass instance = new TopClass.InnerClass(); // works fine 

Qu’est-ce qui ne va pas dans mon code?

Tu fais.

Les classes nestedes utilisent “$” comme séparateur:

 Class.forName("abTopClass$InnerClass"); 

De cette manière, JRE peut utiliser des points pour déterminer les paquets, sans se soucier des classes nestedes. Vous remarquerez cela 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 bloqué dans .NET land jusqu’à ce que je pense aux noms de fichiers …)

essayer

Class.forName("abTopClass$InnerClass");

Les classes internes sont accessibles via le signe dollar:

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

La classe interne est toujours accessible via le signe dollar, car lorsque le compilateur Java comstack le fichier de code source Java, il génère un fichier .class (code octet).

s’il n’y a qu’une classe par exemple Hello.java et que cette classe est une classe externe, alors le compilateur java comstackra lors de la compilation le fichier Hello.class mais si cette classe a une classe interne, HelloInner puis le compilateur java ).

donc le bytecode ressemble toujours à l’extrait suivant avec le nom Outer.java:

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

le code d’octet est donc: Outer $ Inner1 $ Inner2.class

c’est pourquoi nous utilisons $ sign pour accéder à la classe interne 🙂