quel est l'objet de classe (java.lang.De classe)?


La documentation de Java pour Class dit:

Class les objets sont construits automatiquement par la machine virtuelle Java à mesure que les classes sont chargées et par des appels à la méthode defineClass dans le chargeur de classes.

Quels sont ces Class objets? Sont-ils les mêmes que les objets instanciés à partir d'une classe en appelant new?

Aussi, par exemple object.getClass().getName() comment tout peut-il être typé en superclasse Class, même si je n'hérite pas de java.lang.Class?

Author: dimo414, 2010-12-15

5 answers

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

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

  • nom
  • paquet
  • méthodes
  • champs
  • constructeurs
  • annotations

Et quelques méthodes utiles comme le casting et divers contrôles (isAbstract(), isPrimitive(), etc.). le javadoc montre exactement quelles informations vous pouvez obtenir sur une classe.

Ainsi, par exemple, si une de vos méthodes reçoit un objet et que vous souhaitez le traiter au cas où il serait 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 a une annotation donnée. La plupart des méthodes sur une instance Class sont appelées " réfléchissantes opérations", ou simplement " réflexion. Lire ici sur la réflexion, pourquoi et quand elle est utilisée.

Remarque également que les énumérations et les interfaces représentent également un Class objet, et ont les métadonnées.

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

 75
Author: Bozho, 2010-12-15 18:27:14

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 le penser comme un "plan" de la classe réelle. 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 "Voiture" classe.

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

Maintenant, vous pouvez faire toutes sortes d'interrogation sur votre Voiture de classe de cet objet de Classe:

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

Et ainsi de suite. Chaque objet java a une méthode getClass() qui renvoie l'objet Class décrivant la Classe de l'objet Java. Donc, vous pouvez 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 n'importe quel objet java et il imprimera la classe réelle de l'objet que vous lui avez donné.

Lorsque vous travaillez avec Java, la plupart du temps, vous n'avez pas à vous soucier des objets de classe. Ils ont cependant quelques cas d'utilisation pratiques. E. g. ils vous permettent de instanciez par programme les objets d'une certaine classe, qui est souvent utilisée pour la sérialisation et la désérialisation des objets (par exemple, convertir des objets Java en XML et retour, bien surtout retour).

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 ou méthodes déclarés 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 devez en savoir plus à ce sujet, comme s'il imlements une interface, etc., la classe Class est votre ami ici.

Si longue histoire courte, la Classe, le Champ, la Méthode, etc. classes qui sont dans le java.lang.reflect package vous permet d'analyser vos classes, méthodes, champs définis, d'en créer de nouvelles instances, d'appeler des méthodes toutes sortes d'autres choses et ils vous permettent de le faire dynamiquement lors de l'exécution.

 36
Author: Jan Thomä, 2010-12-15 18:25:24

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

Class<?> type = (Class<?>) object;
 7
Author: ColinD, 2010-12-15 18:16:49

Je voudrais également ajouter à la réponse de ColinD que getClass retournera le même objet pour les instances de même type. Cela affichera true :

    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
Author: Koray Tugay, 2015-05-02 09:24:07

Un objet Class est une instance de Class (java.lang.Classe). La citation ci-dessous tirée de 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 à mesure que les classes sont chargées et par des appels à la méthode defineClass dans le chargeur de classe.

 2
Author: Pakka Techie, 2010-12-19 19:03:19