Instanziieren Sie die geschachtelte statische Klasse mit Class.forName
Ich habe eine nested static class
wie:
package a.b
public class TopClass {
public static class InnerClass {
}
}
Möchte ich zu instanziieren mit Class.forName()
aber es wirft ein ClassNotFoundException
.
Class.forName("a.b.TopClass"); //Works fine.
Class.forName("a.b.TopClass.InnerClass"); //raises exception
TopClass.InnerClass instance = new TopClass.InnerClass(); //works fine
Was ist falsch in meinem code?
Udo.
InformationsquelleAutor der Frage ssedano | 2011-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geschachtelte Klassen verwenden Sie "$" als Trennzeichen:
Diese Weise die JRE verwenden können, Punkte zu bestimmen, die Pakete, ohne sich Gedanken über geschachtelte Klassen. Sie werden spot das wenn man sich auf die erzeugte class-Datei, die
TopClass$InnerClass.class
.(EDIT: Entschuldigung für die ursprüngliche Ungenauigkeit. Kopf steckte .NET land, bis ich dachte über den Dateinamen...)
InformationsquelleAutor der Antwort Jon Skeet
versuchen
Class.forName("a.b.TopClass$InnerClass");
InformationsquelleAutor der Antwort Silfverstrom
Innere Klassen zugegriffen werden, die über dollar-Zeichen:
InformationsquelleAutor der Antwort Arturs Licis
Innere Klasse ist immer der Zugriff erfolgt über die dollar-Zeichen, denn wenn der java-compiler kompilieren Sie den java-Quellcode Datei, die es erzeugt .class-Datei(Bytecode).
wenn es nur eine Klasse zum Beispiel Hello.java und diese Klasse ist eine äußere Klasse dann java-compiler auf die Zusammenstellung generieren Hello.class Datei, aber wenn diese Klasse ist eine innere Klasse HelloInner dann java-compiler erzeugt d Hallo$HelloInner.class(byte-code).
also bytecode sieht immer aus wie für die folgenden snippet mit dem Namen Outer.java:
also byte-code ist:Outer$Inner1$Inner2.class
das ist, warum wir verwenden die $ - Zeichen, um Zugriff auf die innere Klasse .:)
InformationsquelleAutor der Antwort Sumit Jhajharia