Que signifie .class en Java?

149

Que .classsignifie Java? Par exemple, si j'ai créé une classe appelée Print. Qu'est-ce qui Print.classrevient?

Quinn Wei
la source
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.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Javier
la source
2
Que peut-on faire avec un objet de classe?
Kevin le
7
@Kevin Consultez la documentation de l'API pour java.lang.Class .
Patricia Shanahan
Application: l' accès à des champs privés, par exemple: Writer.class.getDeclaredField("writeBuffer").
jordanpg
2
Alors quel est le type de Print.class?
Zhipeng YANG
1
Et comment Android gère- new Intent(this, Activity.classt-il? Va-t-il essayer de le découvrir en class Activitycomparant chaque classe?
Zhipeng YANG
56

.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:

String string = "hello";
System.out.println(string.getClass().toString());

Cela produira:

class java.lang.String

C'est la classe de l'objet string :)

christophe
la source
7
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 error

Class c = boolean.class;  // correct

Voir: docs.oracle.com à propos de la classe

Andrew
la source
6

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.

Salvador Valence
la source
3

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;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.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());
       }
    }
Ranjeet
la source
1

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.

Xerxès
la source
4
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<Print> p = Print.class;

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

PbxMan
la source