web-dev-qa-db-fra.com

qu'est-ce que l'objet Class (Java.lang.Class)?

La documentation Java de Class dit:

Les objets Class sont construits automatiquement par la machine virtuelle Java lors du chargement des classes et par les appels à la méthode defineClass dans le chargeur de classes.

Quels sont ces objets Class? Sont-ils identiques aux objets instanciés à partir d'une classe en appelant new?

Aussi, par exemple, object.getClass().getName(), comment tout peut être transtypé en super classe Class, même si je n’hérite pas de Java.lang.Class?

63
Carbonizer

Rien ne se transforme en Class. Chaque Object en Java appartient à un certain class. C'est pourquoi la classe Object, qui est héritée par toutes les autres classes, définit la méthode getClass().

getClass(), ou le littéral de classe - Foo.class renvoie un objet Class, qui contient des métadonnées sur la classe:

  • prénom
  • paquet
  • les méthodes
  • des champs
  • constructeurs
  • annotations

et quelques méthodes utiles comme le casting et diverses vérifications (isAbstract(), isPrimitive(), etc.). the javadoc montre exactement quelles informations vous pouvez obtenir sur une classe.

Ainsi, par exemple, si un objet est attribué à votre méthode et que vous souhaitez le traiter s'il est annoté avec l'annotation @Processable, alors:

public void process(Object obj) {
    if (obj.getClass().isAnnotationPresent(Processable.class)) {
       // process somehow; 
    }
}

Dans cet exemple, vous obtenez les métadonnées sur la classe de l'objet donné (quel qu'il soit) et vérifiez s'il possède une annotation donnée. De nombreuses méthodes sur une instance Class sont appelées "opérations de réflexion", ou simplement "réflexion. Lisez ici à propos de la réflexion, pourquoi et quand elle est utilisée.

Notez également que les énumérations et les interfaces représentent également un objet Class et possèdent les métadonnées correspondantes.

Pour résumer, chaque objet en Java a (appartient à) une classe et a un objet Class respectif, qui contient des métadonnées à ce sujet, qui est accessible à l'exécution.

78
Bozho

Un objet de classe est une sorte de méta-objet décrivant la classe d'un objet. Il est principalement utilisé avec les capacités de réflexion de Java. Vous pouvez penser à cela comme un "plan" de la classe actuelle. Par exemple. vous avez une voiture de classe comme celle-ci:

public class Car {
    public String brand;
}

Vous pouvez ensuite construire un objet de classe qui décrit votre classe "Car". 

Class myCarClass = Class.forName("Car");

Maintenant, vous pouvez faire toutes sortes d'interrogations sur votre classe Car sur cet objet Class:

myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field

etc. Chaque objet Java a une méthode getClass () qui renvoie l'objet Class décrivant la classe de l'objet Java. Pour que vous puissiez faire quelque chose comme:

Car myCar = new Car();
Class myCarClass  = myCar.getClass();

Cela fonctionne également pour les objets que vous ne connaissez pas, par exemple les objets que vous obtenez de l'extérieur:

public void tellMeWhatThisObjectsClassIs(Object obj) {
    System.out.println(obj.getClass().getName());
}

Vous pouvez alimenter cette méthode avec n'importe quel objet Java et elle imprimera la classe réelle de l'objet que vous lui avez donné.

Lorsque vous travaillez avec Java, vous n'avez généralement pas à vous soucier des objets de classe. Ils ont cependant quelques cas d'utilisation pratiques. Par exemple. ils vous permettent d’instancier par programme les objets d’une certaine classe, ce qui est souvent utilisé pour la sérialisation et la désérialisation d’objets (par exemple, la conversion d’objets Java en XML et inversement, généralement très inversement).

Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance();  // is roughly equivalent to = new Car();

Vous pouvez également l'utiliser pour trouver tous les champs déclarés ou les méthodes de votre classe, etc., ce qui est très utile dans certains cas. Donc, par exemple si votre méthode reçoit un objet inconnu et que vous avez besoin d'en savoir plus, comme si elle améliorait une interface, etc., la classe est votre ami ici.

Si long récit, les classes de classe, champ, méthode, etc. qui sont dans le package Java.lang.reflect vous permettent d'analyser vos classes, méthodes, champs définis, en créer de nouvelles instances, d'appeler des méthodes avec toutes sortes d'autres choses et ils vous permettent de le faire dynamiquement au moment de l'exécution. 

39
Jan Thomä

getClass() est une méthode qui renvoie un objet qui est une instance de Java.lang.Class... il n'y a pas de transtypage impliqué Le casting ressemblerait à ceci:

Class<?> type = (Class<?>) object;
7
ColinD

J'aimerais également ajouter à la réponse de ColinD que getClass renverra le même objet pour des instances du même type. Cela affichera vrai :

    MyOtherClass foo = new MyOtherClass();
    MyOtherClass bar = new MyOtherClass();
    System.out.println(foo.getClass()==bar.getClass());

Notez que ce n'est pas égal à , j'utilise == .

4
Koray Tugay

Un objet de classe est une instance de classe (Java.lang.Class). Ci-dessous, une citation tirée du javadoc de la classe devrait répondre à votre question

La classe n'a pas de constructeur public. Au lieu de cela, les objets de classe sont construits automatiquement par la machine virtuelle Java lors du chargement des classes et par des appels à la méthode defineClass du chargeur de classes. 

2
Pakka Techie

La classe Object est la classe parente de toutes les classes en Java par défaut. En d'autres termes, il s'agit de la classe la plus avancée de Java.

La classe Object est utile si vous souhaitez référencer un objet dont vous ne connaissez pas le type. Notez que la variable de référence de la classe parent peut faire référence à l’objet de la classe enfant, appelé upcasting.

Prenons un exemple. Il existe une méthode getObject () qui renvoie un objet, mais il peut être de tout type, par exemple Employee, Student, etc. Par exemple:

Object obj=getObject(); // nous ne savons pas quel objet sera renvoyé par cette méthode 

0
Ishanka Abeysinghe

Afin de bien comprendre l'objet de classe, revenons en arrière et comprenons que nous obtenons l'objet de classe en premier lieu. Vous voyez, chaque fichier .Java que vous créez, lorsque vous compilez ce fichier .Java, le jvm crée un fichier .class, ce fichier contient toutes les informations sur la classe, à savoir:

  1. Nom complet de la classe
  2. Parent de classe
  3. Informations sur la méthode
  4. Champs variables
  5. Constructeur
  6. Informations sur le modificateur
  7. Piscine constante

La liste que vous voyez ci-dessus est ce que vous voyez généralement dans une classe typique. Maintenant, jusqu’à présent, votre fichier .Java et votre fichier .class existent sur votre disque dur. Lorsque vous devez réellement utiliser la classe, c’est-à-dire exécuter du code dans la méthode main(), le jvm utilisera ce fichier .class sur votre disque dur et le chargera dans une des 5 zones de mémoire dans jvm, qui est la zone de méthode, immédiatement après le chargement du fichier .class dans la zone de méthode, jvm utilisera cette information et un objet Class qui représente cette classe qui existe dans la zone de mémoire heap .

Voici la vue de haut niveau,

.Java --compile -> .class -> lorsque vous exécutez votre script -> .class est chargé dans la zone de méthode --jvm crée un objet de classe à partir de la zone de méthode -> un objet de classe est né

Avec un objet de classe, vous obtenez des informations telles que le nom de la classe et les noms de méthodes, ainsi que tout ce qui concerne la classe.

De plus, il ne doit y avoir qu'un seul objet de classe pour chaque classe que vous utilisez dans le script.

J'espère que cela a du sens

0
Brendon Cheung