web-dev-qa-db-fra.com

Comment fonctionne getClass en Java

Voici ce que JavaDoc dit:

public final Class <?> getClass()

Retourne la classe d'exécution de cette Object. L'objet Class renvoyé est l'objet qui est verrouillé par les méthodes static synchronized de la classe représentée.
Le type de résultat actuel est Class<? extends |X|>, où |X| est l'effacement du type statique de l'expression sur laquelle getClass est appelé. Par exemple, aucun transtypage n'est requis dans ce fragment de code:

Number n = 0;
Class<? extends Number> c = n.getClass();

Retourne:
Objet de classe représentant la classe d'exécution de cet objet.

Maintenant, je comprends que c'est une méthode native, elle est donc implémentée dans du code dépendant de la plate-forme. Mais qu'en est-il du type de retour de cette méthode.

public final Class<?> getClass()

Aussi, considérons le code:

class Dog
{
    @Override
    public String toString()
    {
        return "cat";
    }
}

public class Main
{
    public static void main(String[] args)
    {
        Dog d= new Dog();
        //Class<Dog> dd = new Dog();  Compile time error
        System.out.println(d.getClass());
    }
}

Sortie:

classe chien

Donc, ma question réside dans:

  1. Retourne le type de cette méthode
  2. la méthode toString n'est pas appelée. Un article similaire sur ce sujet est: Java. getClass () retourne une classe, comment puis-je aussi obtenir une chaîne?
  3. Le code commenté qui autrement donne une erreur de temps de compilation.
7

Les données de chaque objet contiennent une référence à un objet de la classe Java.lang.Class, qui est renvoyé par la méthode getClass. Il existe également un objet Java.lang.Class décrivant Java.lang.Class.

Pensez à un objet de classe en tant que "modèle" décrivant une certaine classe à partir de laquelle les objets sont créés. Il va de soi que les plans directeurs ont également besoin d'un plan directeur (sinon, comment les ingénieurs sauraient-ils comment fabriquer des plans)?.

Ces déclarations tentent d’illustrer cela.

Integer integer = 1;
Class<?> clazzInteger = integer.getClass();
System.out.println( "class of integer=" + clazzInteger );
Class<?> clazzClazzInteger = clazzInteger.getClass();
System.out.println( "class of class Integer's class=" + clazzClazzInteger );
String string = "x";
Class<?> clazzString = string.getClass();
System.out.println( "class of string=" + clazzString );
Class<?> clazzClazzString = clazzString.getClass();
System.out.println( "class of class String's class=" + clazzClazzString );

Sortie:

class of integer=class Java.lang.Integer
class of class Integer's class=class Java.lang.Class
class of string=class Java.lang.String
class of class String's class=class Java.lang.Class

Une classe a un nom, tout comme tout ce qui est décrit par un plan a un nom à ne pas confondre avec le plan lui-même. Si un objet de classe apparaît dans un certain contexte, sa méthode toString () est appelée implicitement, ce qui retourne la classe ' name . Si vous souhaitez imprimer tous les détails d'une classe (ce qui s'apparente à l'impression du plan directeur lui-même), vous devez écrire beaucoup de code - il suffit de regarder le javadoc pour Java.lang.Class: il y a beaucoup d'informations à récupérer (comme il convient à un plan).

6
laune

À ce stade, nous devons faire la différence entre une type et une instance du type. Permet de l'expliquer avec un exemple. 

    public class A {
        public static void main(String[] args) {
            Class<A> typeInformation = A.class; //Type information associated with type `A`
            A instanceOfA = new A();  //actual instance of type `A`
        }   
    }

Type

La référence 'typeInformation' dans le code ci-dessus est du type Class en laissant de côté les génériques pendant un moment. Ces informations résideront généralement dans une section de mémoire non en tas. Les informations suivantes sont stockées dans chacune des charges type jvm: 

  • Le nom complet du type
  • Nom qualifié complet de la superclasse directe du type (sauf si le type est une interface ou une classe Java.lang.Object, aucune des deux n'ayant de superclasse)
  • Que ce soit ou non le type est une classe ou une interface
  • Les modificateurs du type (un sous-ensemble de public, abstract, final)
  • Une liste ordonnée des noms complets de toutes les superinterfaces directes 

Instance

instaneOfA est une référence à l'instance réelle du type A qui pointe vers une adresse dans la mémoire heap. 

Le type de retour de getClass () est un type générique Class. Comme beaucoup d'autres types disponibles en Java - Chaîne, Entier, etc., Class est également un type représentant les informations de type associées. 

la méthode toString () est associée et appelée sur une variable instance de la classe Dog et non sur le type Dog lui-même. 

//Class<Dog> dd = new Dog(); Compile time error

Cela est dû à une incompatibilité de type lors de l'affectation du résultat de l'expression du côté droit au côté gauche, qui n'est pas du même type. La classe dd fait référence à une référence de type classe. Chien est un type complètement différent, et un nouveau Chien () peut être affecté à une référence du type 'Chien'. 

Ce lien vous aidera à comprendre les aspects de la conception de l'environnement d'exécution Java

1
deepak marathe

J'ai une réponse pour votre question 3,

Cela donne une erreur de compilation car 

Raison 1: pour une instance de classe, vous pouvez uniquement affecter un objet de classe représentant la classe Dog, mais vous ne pouvez pas affecter l'objet de classe Dog directement.

Par exemple: Class dd = Dog.class ou Class dd = Class.forName ("Dog"); Est une syntaxe correcte.

Raison 2: La classe Class est une classe finale, mais pas une super classe pour la classe Dog. Vous revenez au concept de répartition dynamique des méthodes en Java, dans lequel vous ne pouvez affecter des objets de sous-classe qu'à une variable de superclasse.

0
Hasitha Solasa