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.
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 errorClass c =boolean.class;// correct
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.
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.
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;publicclassTest{publicstaticvoid main(String[] args){//there is no instance available for class Test, so use Test.classSystem.out.println("Test.class.getName() ::: "+Test.class.getName());// Now create an instance of class Test use getClass()Test testObj =newTest();System.out.println("testObj.getClass().getName() ::: "+ testObj.getClass().getName());//For primitive typeSystem.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());}}
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.
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
Syntax, die nur zufällig mit der.class
Dateinamenerweiterung zusammenhängt.Antworten:
Wenn Sie
.class
nach einem Klassennamen schreiben , verweist er auf das Klassenliteral -java.lang.Class
Objekt, das Informationen zu einer bestimmten Klasse darstellt.Wenn Ihre Klasse beispielsweise ist
Print
,Print.class
handelt es sich um ein Objekt, das die KlassePrint
zur Laufzeit darstellt. Es ist dasselbe Objekt, das von dergetClass()
Methode einer (direkten) Instanz von zurückgegeben wirdPrint
.quelle
Writer.class.getDeclaredField("writeBuffer")
.Print.class
?new Intent(this, Activity.class
? Wird es versuchen, diesclass Activity
durch Vergleichen jeder Klasse herauszufinden ?.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:
Dies wird Folgendes ausgeben:
Dies ist die Klasse des String-Objekts :)
quelle
getClass()
ist nur nützlich, wenn Sie eine Referenz haben, die auf ein Objekt der Klasse verweist.ClassName.class
kann auch verwendet werden, wenn die Klasse keine Instanzen hat. Betrachten Sie zum BeispielMath.class
. Jeder ist für bestimmte Situationen richtig..class
und.getClass().
Wenn eine Instanz eines Objekts verfügbar ist, ist der einfachste Weg, seine Klasse abzurufen, das Aufrufen
Object.getClass()
Die
.class
SyntaxWenn der Typ verfügbar ist, aber keine Instanz vorhanden ist, können Sie eine Klasse erhalten, indem Sie
.class
an den Namen des Typs anhängen . Dies ist auch der einfachste Weg, um die Klasse für einen primitiven Typ zu erhalten.Siehe: docs.oracle.com über Klasse
quelle
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.
quelle
Wenn keine Instanz verfügbar
.class
ist, 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.class
Syntax für primitive Datentypen verwenden.quelle
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
.class
erhält also den Verweis auf das Class-Objekt dieser Klasse, das dann bearbeitet werden kann.quelle
in a fully object-oriented language, a Class is also an Object
? <Zitat benötigt>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: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
quelle