2010-12-15 99 views
56

La documentation Java pour Class dit:qu'est-ce que l'objet Class (java.lang.Class)?

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

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

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

Répondre

71

Rien ne correspond à 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 la classe littérale - objet Foo.class renvoyer un Class, qui contient des métadonnées sur la classe:

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

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

Ainsi, par exemple, si une méthode de la vôtre est donnée d'un objet, et que vous voulez le traiter dans le cas où il est annoté avec l'annotation @Processable, puis:

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 si elle a une annotation donnée. La plupart des méthodes sur une instance Class sont appelées « opérations réfléchissantes », ou simplement « réflexion. Read here à propos de la réflexion, pourquoi et quand il est utilisé.

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

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 lors de l'exécution

+26

Et c'est amusant d'y réfléchir plus avant. La classe 'Class' hérite de' Object' elle-même. 'Class.class' renvoie un objet' Class' qui représente la classe 'Class'. Vous pouvez réfléchir à la réflexion. MON ASPLODE HEAD. – cdhowie

+0

@cdhowie N'a pas beaucoup utilisé Ruby, hein? :-) –

+1

@pst: J'ai. Ça me donne envie de blesser les gens.Tout langage/framework avec [ce nombre] (http://ruby-doc.org/core/classes/Object.html) méthodes sur son type racine mérite d'être enterré. Il a un syndrome de type PHP-aléatoire-merde-sur-le-API-sans-for-pensée. Cue les flammes ... – cdhowie

7

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

Class<?> type = (Class<?>) object; 
34

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 voir comme un «plan» de la classe réelle. Par exemple. vous avez une classe Car comme ceci:

public class Car { 
    public String brand; 
} 

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

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

Maintenant, vous pouvez faire toutes sortes de requêtes sur votre classe de voiture sur cet objet 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 retourne l'objet Class décrivant la classe de l'objet Java. Ainsi, vous pouvez faire quelque chose comme:

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

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

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

Vous pouvez nourrir cette méthode tout objet java et 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 Class. Ils ont quelques cas pratiques d'utilisation bien. Par exemple. ils vous permettent d'instancier par programmation des objets d'une certaine classe, qui est souvent utilisée pour la sérialisation et la désérialisation d'objets (par exemple, la conversion d'objets Java en XML et vice-versa, bien souvent en retour).

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

Vous pouvez également utiliser pour trouver tous les champs déclarés ou méthodes de votre classe etc, ce qui est très utile dans certains cas. Ainsi, par exemple Si votre méthode reçoit un objet inconnu et que vous avez besoin d'en savoir plus, comme si elle imbrique une interface, etc, la classe Class est votre ami ici. Bref, les classes Class, Field, Method, etc. qui se trouvent dans le package java.lang.reflect vous permettent d'analyser vos classes, méthodes et champs définis, de créer de nouvelles instances, d'appeler toutes les méthodes sortes d'autres choses et ils vous permettent de le faire de manière dynamique au moment de l'exécution.

+0

Classe c1 = classe de voiture; Quelle est cette "classe"? est-ce une variable publique qui existe dans chaque classe? –

+4

Il s'agit essentiellement de sucre syntaxique. C'est quelque chose que le compilateur évalue à quelque chose qui charge l'objet de classe avec le nom donné. Correspond approximativement à Class.forName ("nom de classe entièrement qualifié") mais la classe est vérifiée pour exister au moment de la compilation pendant que Class.forName() est exécuté au moment de l'exécution. –

2

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

La classe n'a pas de constructeur public. Au lieu de cela, les objets Class sont construits automatiquement par la machine virtuelle Java lorsque les classes sont chargées et par des appels à la méthode defineClass dans le chargeur de classe.

4

Je voudrais aussi ajouter à la réponse de ColinD que getClass retourne le même objet pour les instances de même type. Cela imprime 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 ==.