Was bedeutet .class in Java?

149

Was .classbedeutet in Java? Zum Beispiel erzeugen , wenn ich eine Klasse namens Print. Was kommt Print.classzurück?

Quinn Wei
quelle
Ich fürchte, ich verstehe nicht ganz, was Sie fragen. Wenn Sie etwas näher darauf eingehen könnten, könnte Ihnen jemand weitere nützliche Informationen liefern
Paul Walker,
28
Das scheint mir eine echte Frage zu sein. Ich habe diese Frage nur selbst gestellt und mich nach einer kurzen Google-Suche hier wiedergefunden. Ich denke, ich hätte mich nicht darum kümmern sollen, wenn ich gewusst hätte, dass meine Frage nicht real war!
Doktor Jones
1
Ich denke auch, dass aufgrund der Unbeholfenheit der jeweiligen Suchzeichenfolge zu dieser Frage wenig geschrieben oder auffindbar ist. Abgesehen von den oben verlinkten API-Dokumenten habe ich diese Notation noch nie anderswo gesehen (obwohl sie häufig in der Reflexion verwendet wird).
Jordanpg
2
@MadProgrammer Das OP fragt nach der .classSyntax, die nur zufällig mit der .classDateinamenerweiterung zusammenhängt.
Jordanpg

Antworten:

143

Wenn Sie .classnach einem Klassennamen schreiben , verweist er auf das Klassenliteral - java.lang.ClassObjekt, das Informationen zu einer bestimmten Klasse darstellt.

Wenn Ihre Klasse beispielsweise ist Print, Print.classhandelt es sich um ein Objekt, das die Klasse Printzur Laufzeit darstellt. Es ist dasselbe Objekt, das von der getClass()Methode einer (direkten) Instanz von zurückgegeben wird Print.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Javier
quelle
2
Was kann man mit einem Klassenobjekt machen?
Kevin
7
@ Kevin Siehe API-Dokumentation für java.lang.Class .
Patricia Shanahan
Anwendung: Zugriff auf private Felder, zum Beispiel : Writer.class.getDeclaredField("writeBuffer").
Jordanpg
2
Also, was ist die Art von Print.class?
Zhipeng YANG
1
Und wie geht Android damit um new Intent(this, Activity.class? Wird es versuchen, dies class Activitydurch Vergleichen jeder Klasse herauszufinden ?
Zhipeng YANG
56

.class wird verwendet, wenn keine Instanz der Klasse verfügbar ist.

.getClass() wird verwendet, wenn eine Instanz der Klasse verfügbar ist.

object.getClass() Gibt die Klasse des angegebenen Objekts zurück.

Beispielsweise:

String string = "hello";
System.out.println(string.getClass().toString());

Dies wird Folgendes ausgeben:

class java.lang.String

Dies ist die Klasse des String-Objekts :)

Christopher
quelle
7
getClass()ist nur nützlich, wenn Sie eine Referenz haben, die auf ein Objekt der Klasse verweist. ClassName.classkann auch verwendet werden, wenn die Klasse keine Instanzen hat. Betrachten Sie zum Beispiel Math.class. Jeder ist für bestimmte Situationen richtig.
Patricia Shanahan
Geniale Erklärung. Auf den Punkt gebracht. Lieben Sie, wie Sie die Unterscheidung zwischen .classund.getClass().
Sevastyan Savanyuk
6

Wenn eine Instanz eines Objekts verfügbar ist, ist der einfachste Weg, seine Klasse abzurufen, das Aufrufen Object.getClass()

Die .classSyntax

Wenn der Typ verfügbar ist, aber keine Instanz vorhanden ist, können Sie eine Klasse erhalten, indem Sie .classan den Namen des Typs anhängen . Dies ist auch der einfachste Weg, um die Klasse für einen primitiven Typ zu erhalten.

boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct

Siehe: docs.oracle.com über Klasse

Andrew
quelle
6

Zur Verdeutlichung bezieht sich diese '.class'-Methode weder auf die Bytecode-Datei, die Sie nach dem Kompilieren von Java-Code sehen, noch auf eine Verwechslung zwischen den Konzepten von Klasse und Objekt in der OOP-Theorie.

Diese '.class'-Methode wird in Java für die Code-Reflexion verwendet. Im Allgemeinen können Sie Metadaten für Ihre Klasse erfassen, z. B. den vollständigen Namen der qualifizierten Klasse, die Liste der Konstanten, die Liste der öffentlichen Felder usw.

Überprüfen Sie diese Links (bereits oben erwähnt), um alle Details zu erhalten:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html

Normalerweise planen Sie nicht, Reflection sofort zu verwenden, wenn Sie mit der Erstellung Ihres Projekts beginnen. Es ist etwas, von dem Sie wissen, dass Sie es benötigen, nachdem Sie versucht haben, bereits funktionierenden Code zu verwalten. Oft benötigen Sie es, um mehrere Instanzen Ihres Programms zu verwalten. Vielleicht möchten Sie jeden einzelnen 'Klon' identifizieren, um festzustellen, ob bereits etwas definiert ist, oder die Anzahl der Funktionen zählen oder einfach die Details einer bestimmten Instanz Ihrer Klasse protokollieren.

Salvador Valencia
quelle
3

Wenn keine Instanz verfügbar .classist, wird die Syntax verwendet, um das entsprechende Klassenobjekt für eine Klasse abzurufen. Andernfalls können Sie die Methode getClass () verwenden, um das Klassenobjekt abzurufen. Da es keine Instanz des primitiven Datentyps gibt, müssen wir die .classSyntax für primitive Datentypen verwenden.

    package test;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
          System.out.println("int.class.getName() ::: " + int.class.getName());
          System.out.println("char.class.getName() ::: " + char.class.getName());
          System.out.println("long.class.getName() ::: " + long.class.getName());
       }
    }
Ranjeet
quelle
1

Ich denke, der Schlüssel hier ist, den Unterschied zwischen einer Klasse und einem Objekt zu verstehen. Ein Objekt ist eine Instanz einer Klasse. In einer vollständig objektorientierten Sprache ist eine Klasse aber auch ein Objekt . Der Aufruf .classerhält also den Verweis auf das Class-Objekt dieser Klasse, das dann bearbeitet werden kann.

Xerxes
quelle
4
in a fully object-oriented language, a Class is also an Object? <Zitat benötigt>
Sam Dufel
0

Ein Klassenliteral ist ein Ausdruck, der aus dem Namen einer Klasse, einer Schnittstelle, eines Arrays oder eines primitiven Typs oder der Pseudo-Typ-Leere gefolgt von einem '.' Besteht. und die Token-Klasse. Eine der Änderungen in JDK 5.0 ist, dass die Klasse java.lang.Class generisch ist java.lang.Class Class<T>, daher:

Class<Print> p = Print.class;

Referenzen hier:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2

PbxMan
quelle