Java: Kann ein Elternteil der Klasse statisch abrufen-Klasse-name des Kindes-Klasse?
In Bezug auf Java, ich möchte statisch wissen, den Namen der Klasse von der aktuellen Klasse. Eine ist die übergeordnete Klasse B. ich würde gerne eine statische Zeichenfolge in Eine (übergeordnete Klasse), die enthält den Namen der Klasse von der aktuellen Klasse, aber wenn diese static String referenziert wird B (child-Klasse), es soll enthalten den Namen der Klasse B. Ist das möglich?
Beispiel:
public class Parent {
protected static String MY_CLASS_NAME = ???
.
.
.
}
public class Child extends Parent {
public void testMethod() {
if (MY_CLASS_NAME.equals(getClass().getName())) {
System.out.println("We're equal!");
}
}
}
- warum würden Sie das tun, wie Sie bekommen können Klassennamen in anderer Weise?
- Was brauchst du dass denn??
- Ich habe manchmal gewünscht, dass dies möglich waren, auch. Ist es aber nicht. Das Wort
static
bereits bedeutet, dass ein Element/Methode usw ist statisch gelinkt, um die Klasse, die es hält. Sie können nicht außer Kraft setzen - als wenn die Verknüpfung erfolgt dynamisch für die Instanz-Membern/Methoden - mögliche Duplikate von Abstrakte Variablen in Java?
- Wie würden Sie es verwenden, wird die test-Methode nicht wirklich viel sagen.
- Ich Schreibe eine API für andere Entwickler zu verwenden, und ich will Weg, um zu überprüfen, den Namen des Pakets, der Klasse der verschiedenen plugins, die die API verwenden. Ich war in der Planung die Entwickler eine Unterklasse der übergeordneten Klasse und übergeben dieser statischen string zu unserem service zusammen mit den verschiedenen Anforderungen. (Zugegeben, der string könnte wahrscheinlich erreichen das gleiche Ziel einfacher, ohne dass Sie statisch). Andere Vorschläge, wie dieses Ziel zu erreichen? Sieht aus wie es beginnt, zu biegen Sie in eine design-Frage...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einzige Möglichkeit die ich kenne ist folgende:
erstellen Sie geschützte Konstruktor akzeptiert String in übergeordneten Klasse.
BTW Sie können sogar verbessern Sie diese mit
new Throwable().getStackTrace()
in Klammer ist custructor. In diesem Fall werden Sie auch nicht haben, um durchzusetzen, dass alle Kinder verbringen Ihre Namen auf eine übergeordnete Ebene.trace[1].getClassName();
... Nette Idee 🙂Thread#getStackTrace()
seit das erspart Ihnen unnötige und relativ teure Bau von der Ausnahme und Klonierung der stacktrace. Bereitstellen einer abstrakten Konstruktor der Einnahme ein argument ist IMO der Weg zu gehen.Nein, das ist nicht möglich. Es gibt nur eine Kopie der statischen String (pro ClassLoader gemeint), aber Sie können mehrere Unterklassen.
Können Sie jedoch ein statisches Feld pro (sub-)Klasse, und verwenden Sie dann eine Methode
Dies ist eine Technik, die verwendet werden können, um zu vermeiden, Reflexion (der NAME dann auch oft nicht gleich der name der Klasse verwendet wird, sondern einige alias - es kann auch verwendet werden, mit enums anstelle von Strings).
versuchen, diesen code obwohl Sie konnte es nicht mit statischen Variablen
tun, und dass für die erforderlichen Unterklassen