J'ai peur de ne pas comprendre pleinement ce que vous demandez. Si vous pouviez élaborer un peu plus, quelqu'un pourrait peut-être vous fournir des informations plus utiles
Paul Walker
28
Cela me semble certainement être une vraie question. Je me posais juste cette question moi-même et je me suis retrouvé ici après une rapide recherche sur Google. Je suppose que je n'aurais pas dû m'inquiéter si j'avais su que ma question n'était pas réelle!
Doctor Jones
1
De plus, je pense qu'en raison de la maladresse de la chaîne de recherche particulière, il y a peu d'écrit ou de trouvable sur cette question. À part les documents d'API liés à ci-dessus, je n'ai jamais vu cette notation mentionnée nulle part ailleurs (bien que vous la voyiez souvent utilisée en réflexion).
jordanpg
2
@MadProgrammer l'OP pose des questions sur la .classsyntaxe qui n'est qu'incidemment liée à l' .classextension du nom de fichier.
jordanpg
Réponses:
143
Lorsque vous écrivez .classaprès un nom de classe, il fait référence au littéral de classe -
java.lang.Classobjet qui représente des informations sur une classe donnée.
Par exemple, si votre classe est Print, alors Print.classest un objet qui représente la classe Printà l'exécution. C'est le même objet qui est retourné par la getClass()méthode de toute instance (directe) de Print.
getClass()n'est utile que si vous avez une référence pointant vers un objet de la classe. ClassName.classpeut être utilisé même si la classe n'a pas d'instances. Par exemple, considérez Math.class. Chacun est correct pour certaines situations.
Patricia Shanahan
Explication brillante. J'adore la façon dont vous avez identifié la distinction entre .classet.getClass().
Sevastyan Savanyuk
6
Si une instance d'un objet est disponible, le moyen le plus simple d'obtenir sa classe est d'appeler Object.getClass()
La .classsyntaxe
Si le type est disponible mais qu'il n'y a pas d'instance, il est possible d'obtenir une classe en ajoutant .classau nom du type. C'est également le moyen le plus simple d'obtenir la classe pour un type primitif.
boolean b;Class c = b.getClass();// compile-time errorClass c =boolean.class;// correct
Juste pour clarifier, cette méthode '.class' ne fait pas référence au fichier bytecode que vous voyez après la compilation du code java ni à une confusion entre les concepts de classe vs objet dans la théorie POO.
Cette méthode '.class' est utilisée en Java pour la réflexion de code. En règle générale, vous pouvez collecter des métadonnées pour votre classe telles que le nom complet de la classe qualifiée, la liste des constantes, la liste des champs publics, etc., etc.
Normalement, vous ne prévoyez pas d'utiliser Reflection tout de suite lorsque vous commencez à créer votre projet. C'est quelque chose dont vous savez avoir besoin après avoir essayé de gérer du code déjà fonctionnel. Vous en avez souvent besoin pour gérer plusieurs instances de votre programme. Peut-être souhaitez-vous identifier chaque «clone» particulier pour déterminer si quelque chose est déjà défini, ou compter le nombre de fonctions, ou simplement enregistrer les détails d'une instance particulière de votre classe.
S'il n'y a pas d'instance disponible, la .classsyntaxe est utilisée pour obtenir l'objet Class correspondant pour une classe, sinon vous pouvez utiliser la méthode getClass () pour obtenir l'objet Class. Puisqu'il n'y a pas d'instance de type de données primitif, nous devons utiliser la .classsyntaxe pour les types de données primitifs.
package test;publicclassTest{publicstaticvoid main(String[] args){//there is no instance available for class Test, so use Test.classSystem.out.println("Test.class.getName() ::: "+Test.class.getName());// Now create an instance of class Test use getClass()Test testObj =newTest();System.out.println("testObj.getClass().getName() ::: "+ testObj.getClass().getName());//For primitive typeSystem.out.println("boolean.class.getName() ::: "+boolean.class.getName());System.out.println("int.class.getName() ::: "+int.class.getName());System.out.println("char.class.getName() ::: "+char.class.getName());System.out.println("long.class.getName() ::: "+long.class.getName());}}
Je pense que la clé ici est de comprendre la différence entre une classe et un objet. Un objet est une instance d'une classe. Mais dans un langage entièrement orienté objet, une classe est aussi un objet . Donc, appeler .classobtient la référence à l'objet Class de cette classe, qui peut ensuite être manipulée.
in a fully object-oriented language, a Class is also an Object? <citation nécessaire>
Sam Dufel
0
Un littéral de classe est une expression constituée du nom d'une classe, d'une interface, d'un tableau ou d'un type primitif, ou du pseudo-type void, suivi d'un '.' et la classe de jeton. L'un des changements dans JDK 5.0 est que la classe java.lang.Class est générique java.lang.Class Class<T>, donc:
.class
syntaxe qui n'est qu'incidemment liée à l'.class
extension du nom de fichier.Réponses:
Lorsque vous écrivez
.class
après un nom de classe, il fait référence au littéral de classe -java.lang.Class
objet qui représente des informations sur une classe donnée.Par exemple, si votre classe est
Print
, alorsPrint.class
est un objet qui représente la classePrint
à l'exécution. C'est le même objet qui est retourné par lagetClass()
méthode de toute instance (directe) dePrint
.la source
Writer.class.getDeclaredField("writeBuffer")
.Print.class
?new Intent(this, Activity.class
t-il? Va-t-il essayer de le découvrir enclass Activity
comparant chaque classe?.class
est utilisé lorsqu'il n'y a pas d'instance de la classe disponible..getClass()
est utilisé lorsqu'une instance de la classe est disponible.object.getClass()
renvoie la classe de l'objet donné.Par exemple:
Cela produira:
C'est la classe de l'objet string :)
la source
getClass()
n'est utile que si vous avez une référence pointant vers un objet de la classe.ClassName.class
peut être utilisé même si la classe n'a pas d'instances. Par exemple, considérezMath.class
. Chacun est correct pour certaines situations..class
et.getClass().
Si une instance d'un objet est disponible, le moyen le plus simple d'obtenir sa classe est d'appeler
Object.getClass()
La
.class
syntaxeSi le type est disponible mais qu'il n'y a pas d'instance, il est possible d'obtenir une classe en ajoutant
.class
au nom du type. C'est également le moyen le plus simple d'obtenir la classe pour un type primitif.Voir: docs.oracle.com à propos de la classe
la source
Juste pour clarifier, cette méthode '.class' ne fait pas référence au fichier bytecode que vous voyez après la compilation du code java ni à une confusion entre les concepts de classe vs objet dans la théorie POO.
Cette méthode '.class' est utilisée en Java pour la réflexion de code. En règle générale, vous pouvez collecter des métadonnées pour votre classe telles que le nom complet de la classe qualifiée, la liste des constantes, la liste des champs publics, etc., etc.
Consultez ces liens (déjà mentionnés ci-dessus) pour obtenir tous les détails:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html
Normalement, vous ne prévoyez pas d'utiliser Reflection tout de suite lorsque vous commencez à créer votre projet. C'est quelque chose dont vous savez avoir besoin après avoir essayé de gérer du code déjà fonctionnel. Vous en avez souvent besoin pour gérer plusieurs instances de votre programme. Peut-être souhaitez-vous identifier chaque «clone» particulier pour déterminer si quelque chose est déjà défini, ou compter le nombre de fonctions, ou simplement enregistrer les détails d'une instance particulière de votre classe.
la source
S'il n'y a pas d'instance disponible, la
.class
syntaxe est utilisée pour obtenir l'objet Class correspondant pour une classe, sinon vous pouvez utiliser la méthode getClass () pour obtenir l'objet Class. Puisqu'il n'y a pas d'instance de type de données primitif, nous devons utiliser la.class
syntaxe pour les types de données primitifs.la source
Je pense que la clé ici est de comprendre la différence entre une classe et un objet. Un objet est une instance d'une classe. Mais dans un langage entièrement orienté objet, une classe est aussi un objet . Donc, appeler
.class
obtient la référence à l'objet Class de cette classe, qui peut ensuite être manipulée.la source
in a fully object-oriented language, a Class is also an Object
? <citation nécessaire>Un littéral de classe est une expression constituée du nom d'une classe, d'une interface, d'un tableau ou d'un type primitif, ou du pseudo-type void, suivi d'un '.' et la classe de jeton. L'un des changements dans JDK 5.0 est que la classe java.lang.Class est générique
java.lang.Class Class<T>
, donc:Références ici:
https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
http://docs.oracle.com/javase/tutorial/extra/generics/literals.html
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2
la source