Welche Vor- und Nachteile gibt es in Java im Zusammenhang mit der Wahl der Verwendung a.getClass()
oder A.class
? Entweder kann verwendet werden, wo immer a Class<?>
erwartet wird, aber ich stelle mir vor, dass die Verwendung beider unter verschiedenen Umständen (genau wie bei Class.forName()
und) Leistung oder andere subtile Vorteile hätte ClassLoader.loadClass()
.
quelle
A.class.getClass()
?Class
Objekt der Klasse geben, das das Objekt darstellt, von demA.class
wiederum eine Instanz istjava.lang.Class
.A.getClass().class
?A
es sich um eine Klasse handelt. Es gibt keine statischegetClass
Methode für Klassen.Sie unterscheiden sich tatsächlich darin, wo Sie sie verwenden können.
A.class
Funktioniert zur Kompilierungszeit,a.getClass()
erfordert eine Instanz vom TypA
und zur Laufzeit.Es kann auch einen Leistungsunterschied geben. Während
A.class
der Compiler ihn auflösen kann, weil er den tatsächlichen Typ von kenntA
,a.getClass()
findet zur Laufzeit ein virtueller Methodenaufruf statt.Als Referenz gibt ein Compiler, der auf Bytecode abzielt, normalerweise die folgenden Anweisungen aus für
Integer.getClass()
:und folgendes für
Integer.class
:Ersteres würde typischerweise einen virtuellen Methodenversand beinhalten und daher vermutlich länger dauern, um ausgeführt zu werden. Das ist aber letztendlich JVM-abhängig.
quelle
Schauen Sie sich die folgenden Beispiele an
a.getClass()!= A.class
dh a ist keine Instanz von A, sondern einer anonymen Unterklasse von A.a.getClass()
erfordert eine Instanz vom Typ A.quelle
Verwenden
a.getClass
Sie diese Option, wenn Sie eine Instanz von Klasse / Typ haben und den genauen Typ davon erhalten möchten. whilea.class
wird verwendet, wenn Sietype
verfügbar sind und eine Instanz davon erstellen möchten.Auch
getClass()
gibt Laufzeittyp der Instanz , während.class
bei der Kompilierung ausgewertet wird.In Anbetracht Leistung
getClass()
und.class
,.class
hat eine bessere Leistung alsgetClass()
.Beispiel:
Ausgabe :
quelle
Es gibt einen Unterschied, den ich hinzufügen möchte. Angenommen, Sie haben eine Klasse als Konstruktor, wie unten gezeigt, mit einer Superklasse, die ein Class-Objekt akzeptiert. Sie möchten, dass das Klassenobjekt der Unterklasse bei jeder Erstellung eines Unterklassenobjekts an die Superklasse übergeben wird. Der folgende Code wird nicht kompiliert, da Sie keine Instanzmethode in einem Konstruktor aufrufen können. In diesem Fall , wenn Sie ersetzen
myObject.getClass()
mitMyClass.class
. Es wird perfekt laufen.quelle
Interessanterweise scheinen die im obigen Beispiel erwähnten Leistungsunterschiede mit anderen Gründen in Zusammenhang zu stehen. Bei Verwendung von 3 verschiedenen Klassen ist die Leistung im Durchschnitt nahezu gleich:
Die Ausgabe wird ungefähr so aussehen:
Wenn Sie die Reihenfolge der Anrufe ändern, wird dies sogar
getClass()
schneller.Ausgabe:
quelle
p.getClass()
, wobei thep
eine Instanz eines Objekts ist, gibt die Laufzeitklasse dieses Objekts zurückp
.p
kann kein Typ sein, der einen Fehler bei der Kompilierung verursacht, es sollte eine Instanz eines Objekts sein.p.class
ist ein Ausdruck. Das.class
wird als Klassensyntax bezeichnet.p
ist ein Typ. Dies kann der Name einer Klasse, einer Schnittstelle oder eines Arrays und sogar ein primitiver Typ sein.a.getClass() == B.class
.Wenn ein Typ verfügbar ist und eine Instanz vorhanden ist, können Sie mithilfe der
getClass
Methode den Namen des Typs abrufen. Verwenden Sie andernfalls die.class
Syntaxquelle