wake-up-neo.net

was ist das Klassenobjekt (Java.lang.Class)?

Die Java-Dokumentation für Class sagt:

Class-Objekte werden automatisch von der Java Virtual Machine erstellt, wenn Klassen geladen werden, und durch Aufrufe der defineClass-Methode im Klassenladeprogramm.

Was sind diese Class Objekte? Sind sie identisch mit Objekten, die von einer Klasse durch Aufruf von new instanziiert werden?

Zum Beispiel object.getClass().getName(), wie kann alles in die Superklasse Class konvertiert werden, auch wenn ich nicht von Java.lang.Class erbe?

63
Carbonizer

Nichts wird in Class umgewandelt. Jedes Object in Java gehört zu einem bestimmten class. Deshalb definiert die Object-Klasse, die von allen anderen Klassen geerbt wird, die getClass()-Methode.

getClass() oder das Klassenliteral - Foo.class gibt ein Class-Objekt zurück, das einige Metadaten zur Klasse enthält:

  • name
  • paket
  • methoden
  • felder
  • konstruktoren
  • anmerkungen

und einige nützliche Methoden wie Casting und verschiedene Prüfungen (isAbstract(), isPrimitive() usw.). der Javadoc zeigt genau, welche Informationen Sie über eine Klasse erhalten können.

Wenn zum Beispiel einer Ihrer Methoden ein Objekt zugewiesen wurde, und Sie dieses bearbeiten möchten, falls es mit der Annotation @Processable kommentiert wird, dann gilt Folgendes:

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

In diesem Beispiel erhalten Sie die Metadaten über die Klasse des angegebenen Objekts (was auch immer es ist), und prüfen, ob eine Anmerkung vorhanden ist. Viele der Methoden in einer Class-Instanz werden "reflektierende Operationen" oder einfach "Reflektion" genannt. Lesen Sie hier über Reflektion, warum und wann sie verwendet wird.

Beachten Sie auch, dass Enums und Interfaces auch ein Class-Objekt darstellen und über die entsprechenden Metadaten verfügen.

Zusammenfassend: Jedes Objekt in Java besitzt (gehört zu) einer Klasse und verfügt über ein entsprechendes Class-Objekt, das Metadaten enthält, auf die zur Laufzeit zugegriffen werden kann.

78
Bozho

Ein Klassenobjekt ist eine Art Metaobjekt, das die Klasse eines Objekts beschreibt. Es wird hauptsächlich mit den Reflection-Funktionen von Java verwendet. Sie können sich wie ein "Bauplan" der Klasse vorstellen. Z.B. Du hast eine Klasse Auto wie folgt:

public class Car {
    public String brand;
}

Sie können dann ein Class-Objekt erstellen, das Ihre "Car" -Klasse beschreibt. 

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

Jetzt können Sie alle Arten von Abfragen Ihrer Fahrzeugklasse zu diesem Klassenobjekt durchführen:

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

und so weiter. Jedes Java-Objekt hat eine Methode getClass (), die das Class-Objekt zurückgibt, das die Klasse des Java-Objekts beschreibt. Du könntest also so etwas tun:

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

Dies funktioniert auch für Objekte, die Sie nicht kennen, z. B. Objekte, die Sie von außen erhalten:

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

Sie können dieser Methode ein beliebiges Java-Objekt zuführen, und es wird die Klasse des Objekts ausgegeben, das Sie dem Objekt gegeben haben.

Wenn Sie mit Java arbeiten, müssen Sie sich meist nicht um Klassenobjekte kümmern. Sie haben jedoch einige praktische Anwendungsfälle. Z.B. Sie ermöglichen es Ihnen, Objekte einer bestimmten Klasse programmgesteuert zu instanziieren, die häufig zur Objektserialisierung und -deserialisierung verwendet wird (z. B. Konvertieren von Java-Objekten in XML und zurück, meistens jedoch zurück).

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

Sie können es auch verwenden, um alle deklarierten Felder oder Methoden Ihrer Klasse usw. herauszufinden, was in bestimmten Fällen sehr nützlich ist. So z. Wenn Ihrer Methode ein unbekanntes Objekt übergeben wird und Sie mehr darüber wissen müssen, z. B. wenn sie ein Interface usw. verbessert, ist die Klasse class Ihr Freund hier.

Kurz gesagt, die Klassen Class, Field, Method usw., die im Java.lang.reflect-Paket enthalten sind, ermöglichen es Ihnen, Ihre definierten Klassen, Methoden, Felder zu analysieren, neue Instanzen davon zu erstellen, Methoden alle möglichen anderen Dinge aufzurufen und sie ermöglichen es Ihnen, dies zur Laufzeit dynamisch auszuführen. 

39
Jan Thomä

getClass() ist eine Methode, bei der return ein Objekt ist, das eine Instanz von Java.lang.Class... ist. Casting würde so aussehen:

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

Ich möchte auch der Antwort von ColinD hinzufügen, dass getClass das gleiche Objekt für Instanzen desselben Typs zurückgibt. Dies wird drucken true :

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

Beachten Sie, dass es nicht gleich ist, ich verwende == .

4
Koray Tugay

Ein Class-Objekt ist eine Instanz von Class (Java.lang.Class). Das folgende Zitat aus dem Javadoc der Klasse sollte Ihre Frage beantworten

Klasse hat keinen öffentlichen Konstruktor. Stattdessen werden Klassenobjekte automatisch von der Java Virtual Machine erstellt, wenn Klassen geladen werden, und durch Aufrufen der defineClass-Methode im Klassenlader. 

2
Pakka Techie

Die Object-Klasse ist standardmäßig die übergeordnete Klasse aller Klassen in Java. Mit anderen Worten, es ist die oberste Klasse von Java.

Die Object-Klasse ist nützlich, wenn Sie auf ein Objekt verweisen möchten, dessen Typ Sie nicht kennen. Beachten Sie, dass die Referenzvariable der übergeordneten Klasse auf das untergeordnete Klassenobjekt verweisen kann, das als Upcasting bezeichnet wird.

Nehmen wir ein Beispiel: Es gibt die getObject () -Methode, die ein Objekt zurückgibt, aber es kann ein beliebiger Typ wie Employee, Student usw. sein. Die Objektklassenreferenz kann für das Objekt verwendet werden. Zum Beispiel:

Object obj=getObject(); // wir wissen nicht, welches Objekt von dieser Methode zurückgegeben wird 

0

Um das Klassenobjekt vollständig zu verstehen, lassen Sie uns zurückgehen und verstehen, dass wir das Klassenobjekt an erster Stelle haben. Sie sehen, jede .Java-Datei, die Sie erstellen. Wenn Sie diese .Java-Datei kompilieren, erstellt der JVM eine .class-Datei. Diese Datei enthält alle Informationen über die Klasse, nämlich:

  1. Vollqualifizierter Name der Klasse
  2. Elternteil der Klasse
  3. Methodeninformation
  4. Variable Felder
  5. Konstrukteur
  6. Modifikatorinformationen
  7. Ständiger Pool

Die Liste, die Sie oben sehen, ist das, was Sie normalerweise in einer typischen Klasse sehen. Bis zu diesem Punkt befinden sich Ihre .Java-Datei und Ihre .class-Datei auf Ihrer Festplatte. Wenn Sie die Klasse tatsächlich verwenden müssen, dh Code in der main()-Methode ausführen, verwendet der JVM diese .class-Datei auf Ihrer Festplatte und lädt sie in diese Datei In einem von 5 Speicherbereichen in jvm, dem Methodenbereich, verwendet der jvm unmittelbar nach dem Laden der .class-Datei in den Methodenbereich diese Informationen und ein Klassenobjekt, das für die Klasse steht, die im Heap-Speicherbereich vorhanden ist .

Hier ist die Ansicht der obersten Ebene,

.Java --compile -> .class -> wenn Sie Ihr Skript ausführen -> .class wird in den Methodenbereich geladen --jvm erstellt ein Klassenobjekt aus dem Methodenbereich -> ein Klassenobjekt wird geboren

Mit einem Klassenobjekt erhalten Sie Informationen wie Klassennamen und Methodennamen, alles über die Klasse.

Beachten Sie auch, dass für jede Klasse, die Sie im Skript verwenden, nur ein Klassenobjekt vorhanden sein darf.

Hoffe das macht Sinn

0
Brendon Cheung