W Javie, jakie zalety / wady istnieją wokół wyboru użycia a.getClass()
lub A.class
? Każda z nich może być używana wszędzie tam, gdzie Class<?>
jest oczekiwane, ale wyobrażam sobie, że użycie obu w różnych okolicznościach przyniosłoby wydajność lub inne subtelne korzyści (tak jak w przypadku Class.forName()
i ClassLoader.loadClass()
.
źródło
A.class.getClass()
?Class
obiekt klasy reprezentującejA.class
obiekt, który ponownie jest instancjąjava.lang.Class
.A.getClass().class
?A
jest to klasa. WgetClass
klasach nie ma metody statycznej .W rzeczywistości różnią się pod względem miejsca, w którym można ich używać.
A.class
działa w czasie kompilacji, podczas gdya.getClass()
wymaga wystąpienia typuA
i działa w czasie wykonywania.Może również wystąpić różnica w wydajności. While
A.class
może zostać rozwiązany przez kompilator, ponieważ zna rzeczywisty typA
,a.getClass()
jest wywołaniem metody wirtualnej w czasie wykonywania.Dla porównania kompilator przeznaczony dla kodu bajtowego zazwyczaj emituje następujące instrukcje dotyczące
Integer.getClass()
:oraz następujące dla
Integer.class
:Pierwsza z nich wymagałaby zazwyczaj wysyłania metody wirtualnej i dlatego prawdopodobnie wykonanie jej zajęłoby więcej czasu. To jednak ostatecznie zależy od JVM.
źródło
spójrz na poniższe przykłady
a.getClass()!= A.class
, tj. a nie jest instancją A, ale anonimowej podklasy Aa.getClass()
wymaga wystąpienia typu A.źródło
Użyj,
a.getClass
gdy masz instancję klasy / typu i chcesz uzyskać jej dokładny typ. whilea.class
jest używany, gdy masztype
dostępne i chcesz utworzyć jego instancję. Zwracarównież
getClass()
typ instancji środowiska.class
uruchomieniowego, podczas gdy jest oceniany w czasie kompilacji.Biorąc pod uwagę wydajność
getClass()
i.class
,.class
ma lepszą wydajność niżgetClass()
.Przykład:
Wynik :
źródło
Jest jedna różnica, którą chciałbym dodać. Powiedzmy, że masz klasę konstruktora, jak pokazano poniżej, z superklasą, która przyjmuje obiekt Class. Chcesz, aby za każdym razem, gdy tworzony był obiekt podklasy, obiekt klasy podklasy był przekazywany do superklasy. Poniższy kod nie zostanie skompilowany, ponieważ nie można wywołać metody instancji w konstruktorze. W takim przypadku, jeśli zastąpi
myObject.getClass()
sięMyClass.class
. Będzie działać idealnie.źródło
Co ciekawe, różnice w działaniu, o których mowa w powyższym przykładzie, wydają się mieć inne przyczyny. Używając 3 różnych klas, średnia wydajność będzie prawie taka sama:
Wynik będzie podobny do:
A zmiana kolejności połączeń spowoduje nawet
getClass()
szybsze działanie.Wynik:
źródło
p.getClass()
, gdziep
jest instancją obiektu, zwraca klasę środowiska wykonawczego tego obiektup
.p
nie może być typem, który spowoduje błąd w czasie kompilacji, powinien to być instancja obiektu.p.class
jest wyrażeniem..class
Nazywa składnia klasa.p
jest typem. Może to być nazwa klasy, interfejsu lub tablicy, a nawet typ prymitywny.a.getClass() == B.class
.Jeśli typ jest dostępny i istnieje instancja, można użyć
getClass
metody, aby uzyskać nazwę typu. W przeciwnym razie użyj.class
składniźródło