Instancier imbriquée classe statique à l'aide de la Classe.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 il 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
Ce qui est faux dans mon code?
Udo.
Class.forName("a.b.TopClass$InnerClass");
- ...mais s'il vous plaît ne pas si vous pouvez l'éviter.
Vous devez vous connecter pour publier un commentaire.
Classes imbriquées utiliser "$" comme séparateur:
De cette façon, le JRE peut utiliser des points de déterminer les paquets, sans se soucier de classes imbriquées. Vous apercevrez si vous regardez le fichier de classe générée, qui sera
TopClass$InnerClass.class
.(EDIT: toutes mes Excuses pour l'origine de l'inexactitude. La tête a été coincé dans .NET la terre jusqu'à ce que je pensais sur les noms de fichiers...)
essayer
Class.forName("a.b.TopClass$InnerClass");
Les classes internes sont accessibles via le signe du dollar:
Intérieur de la classe est toujours accessible via le signe du dollar parce que quand compilateur java compiler le code source java de fichiers qu'il génère .fichier de classe(byte code).
si il y a une seule classe par exemple Hello.java et cette classe est l'extérieur de la classe java compilateur sur la compilation de générer Hello.class fichier mais si cette classe a un intérieur de classe HelloInner puis java compilateur génère d Bonjour$HelloInner.class(byte code).
donc bytecode a toujours l'air comme pour l'extrait de code suivant avec nom Outer.java:
afin de byte code est:à l'Extérieur$Inner1$Inner2.class
c'est pourquoi nous utilisons le signe $ pour accéder intérieur de la classe .:)