Was .class
bedeutet in Java? Zum Beispiel erzeugen , wenn ich eine Klasse namens Print
. Was kommt Print.class
zurück?
.class
Syntax, die nur zufällig mit der .class
Dateinamenerweiterung zusammenhängt.
Was .class
bedeutet in Java? Zum Beispiel erzeugen , wenn ich eine Klasse namens Print
. Was kommt Print.class
zurück?
.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 Klasse Print
zur 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());
Writer.class.getDeclaredField("writeBuffer")
.
Print.class
?
new Intent(this, Activity.class
? Wird es versuchen, dies class 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:
String string = "hello";
System.out.println(string.getClass().toString());
Dies wird Folgendes ausgeben:
class java.lang.String
Dies ist die Klasse des String-Objekts :)
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 Beispiel Math.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
Syntax
Wenn 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.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Siehe: docs.oracle.com über Klasse
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.
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.
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());
}
}
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.
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:
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