En Java, quels avantages / inconvénients existent autour du choix d'utiliser a.getClass()
ou A.class
? L'un ou l'autre peut être utilisé partout où un Class<?>
est attendu, mais j'imagine qu'il y aurait des performances ou d'autres avantages subtils à utiliser les deux dans des circonstances différentes (tout comme il y en a avec Class.forName()
et ClassLoader.loadClass()
.
la source
A.class.getClass()
?Class
objet de la classe représentant l'A.class
objet qui est à nouveau une instance dejava.lang.Class
.A.getClass().class
?A
c'est une classe. Il n'y a pas degetClass
méthode statique sur les classes.Ils sont en fait différents en ce qui concerne les endroits où vous pouvez les utiliser.
A.class
fonctionne au moment de la compilation alors qu'ila.getClass()
nécessite une instance de typeA
et fonctionne au moment de l'exécution.Il peut également y avoir une différence de performance. Alors que
A.class
peut être résolu par le compilateur car il connaît le type réel deA
,a.getClass()
un appel de méthode virtuelle se produit au moment de l'exécution.Pour référence, un compilateur ciblant le bytecode émet généralement les instructions suivantes pour
Integer.getClass()
:et ce qui suit pour
Integer.class
:Le premier impliquerait généralement une distribution de méthode virtuelle et prendrait donc vraisemblablement plus de temps à s'exécuter. Cela dépend cependant de la JVM.
la source
jetez un œil aux exemples ci-dessous
a.getClass()!= A.class
, ie a n'est pas une instance de A mais d'une sous-classe anonyme de Aa.getClass()
nécessite une instance de type Ala source
À utiliser
a.getClass
lorsque vous avez une instance de classe / type et que vous souhaitez en obtenir le type exact. whilea.class
est utilisé lorsque vous en disposeztype
et que vous souhaitez en créer une instance.Renvoie également le
getClass()
type d'exécution de l'instance pendant qu'elle.class
est évaluée au moment de la compilation.Compte tenu des performances de
getClass()
et.class
,.class
a de meilleures performances quegetClass()
.Exemple :
Production :
la source
Il y a une différence que je voudrais ajouter. Supposons que vous ayez une classe un constructeur comme indiqué ci-dessous avec une super classe qui prend un objet Class. Vous voulez que chaque fois qu'un objet de sous-classe est créé, l'objet de classe de la sous-classe soit passé à la super-classe. Le code ci-dessous ne sera pas compilé car vous ne pouvez pas appeler une méthode d'instance dans un constructeur. Dans ce cas, si vous remplacez
myObject.getClass()
parMyClass.class
. Cela fonctionnera parfaitement.la source
Il est intéressant de noter que les différences de performance mentionnées dans l'exemple ci-dessus semblent être liées à d'autres raisons. En utilisant 3 classes différentes, en moyenne, les performances seront presque les mêmes:
La sortie sera quelque chose comme:
Et changer l'ordre des appels vous permettra même d'
getClass()
être plus rapide.Production:
la source
p.getClass()
, oùp
est une instance d'un objet, renvoie la classe d'exécution de cet objetp
.p
ne peut pas être un type qui provoquera une erreur de compilation, il doit s'agir d'une instance d'un objet.p.class
est une expression. Le.class
s'appelle la syntaxe de classe.p
est un type. Cela peut être le nom d'une classe, d'une interface ou d'un tableau et même d'un type primitif.a.getClass() == B.class
.Si un type est disponible et qu'il existe une instance, il est possible d'utiliser la
getClass
méthode pour obtenir le nom du type. Sinon, utilisez la.class
syntaxela source