12 Stimmen

Arbeiten mit dem Schlagwort class in Java

Ich verstehe nicht wirklich, wie das class-Schlüsselwort in einigen Fällen funktioniert.

Zum Beispiel nimmt die Methode get(ClientResponse.class) die ClientResponse.class. Wie wird dies verwendet, wenn es erhalten wird, und was sind die Vorteile gegenüber dem einfachen Übergeben einer Instanz davon?

10voto

smcg Punkte 3085
SomeClass.class

gibt ein Java-Klassenobjekt zurück. Class ist verallgemeinert, also wird der tatsächliche Typ von SomeClass.class Class sein.

Es gibt viele Verwendungen für dieses Objekt, und Sie können das Javadoc hier lesen: http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html

7voto

Bhesh Gurung Punkte 49812

In ClientResponse.class, class ist weder ein Schlüsselwort noch ein statisches Feld in der Klasse ClientResponse.

Das Schlüsselwort ist das, das wir verwenden, um eine Klasse in Java zu definieren. z.B.

public class MyClass { } /* Die hier verwendete Klasse ist eines der Schlüsselwörter in Java */

Das class in ClientResponse.class ist eine Abkürzung zur Instanz von Class, die die Klasse ClientResponse repräsentiert.

Es gibt einen anderen Weg, um zu dieser Instanz zu gelangen, für die Sie eine Instanz von ClientResponse benötigen. z.B

ClientResponse obj = new ClientResponse();
Class clazz = obj.getClass(); 

Was sind die Vorteile gegenüber einfach nur eine Instanz davon zu übergeben?

In dem obigen Beispiel kann man sehen, was passieren würde, wenn obj null wäre (eine NullPointerException). Dann gäbe es keine Möglichkeit für die Methode, die Referenz zur Class-Instanz für ClientResponse zu erhalten.

2voto

duffymo Punkte 298898

Die Klasse Class, die sich von dem Schlüsselwort class unterscheidet, ist Metadaten, die Instanzen beschreiben. Es informiert Sie über die Methoden, Datenelemente, Konstruktoren und andere Funktionen der Instanzen, die Sie durch Aufrufen von new erstellen.

Zum Beispiel nimmt die Methode get(ClientResponse.class) die ClientResponse.class und wie verwendet sie diese, wenn sie sie erhält, und welche Vorteile bringt es gegenüber dem einfachen Übergeben einer Instanz davon?

Sie können keine Instanz von ClientResponse an diese Methode übergeben; sie erwartet Metadaten über alle Instanzen von ClientResponse. Wenn Sie eine Instanz übergeben hätten, würden Sie erwarten, dass die Methode den Zustand dieser Instanz ändern könnte. Aber das Übergeben der Metadaten über alle Instanzen könnte es der Methode ermöglichen, eine neue Art von Instanz zu erstellen (z.B. ein dynamischer Proxy) oder etwas anderes zu tun, das von den Metadaten über alle Instanzen von ClientResponse abhängt. Sehen Sie den Unterschied?

2voto

Chip Punkte 3086

Eine Klasse ist eine "Bluprint" des Objekts. Die Instanz ist ein Objekt.

Wenn wir haben

public class SomeClass {
   int a;
   SomeClass(int a) {
      this.a = a
   }
}

Können wir eine Instanz dieser Klasse haben

SomeClass c = new SomeClass(10);

c ist eine Instanz der Klasse. Es hat einen Integer a mit dem Wert 10.

Das Objekt SomeClass.class repräsentiert eine Klasse.

Hier ist SomeClass.class ein Objekt des Typs Klasse, das die Information enthält, dass SomeClass ist

  1. eine konkrete Klasse mit
  2. einem Konstruktor
  3. mit einem Integer-Mitgliedsvariablen

    und viele weitere Metadaten über die Klasse SomeClass. Beachten Sie, dass es keinen Wert für a hat.

Sie sollten get(c) verwenden, falls Sie etwas mit einer Instanz von c planen, wie zum Beispiel den Aufruf von c.a oder anderen nützlichen Funktionen zur Manipulation/Abfrage von Daten der Instanz.

Sie sollten get(SomeClass.class) verwenden, wenn das Ergebnis des Abrufs auf der Tatsache basiert, dass das Argument ein bestimmter Klassentyp ist. Zum Beispiel, wenn dies eine Methode auf einer Registry-Klasse ist, die eine Map enthält, die eine Implementierungsklasse basierend auf dem übergebenen Klassentyp abruft.

2voto

Der allerwichtigste Fakt ist - du brauchst keine Instanz haben, um die Methode aufzurufen. Das ist besonders nützlich in Situationen, in denen du aus irgendeinem Grund keine Klasse instanziieren kannst, z.B. wenn sie abstrakt ist, oder nur einen privaten Konstruktor hat, oder nur von einem Framework, wie Spring oder JSF, korrekt instanziiert werden kann.

Du kannst dann get aufrufen, um ein Objekt eines bestimmten Typs zu erhalten, ohne zu wissen, woher es kommt und wie es erstellt wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X