Nach meiner Kenntnis wird jedesmal, wenn eine Klasse geladen wird, ein Objekt von Class.class dafür von JVM erstellt, das alle Metainformationen der geladenen Klasse speichert.Wie schreibt classname.class den Verweis auf das java.lang.Class-Objekt?
Wenn wir forName ("Klassenname") -Methode verwenden, lädt es zuerst "Klassenname" und erstellt dann das Class.class-Objekt und gibt den Verweis auf das erstellte Class.class-Objekt zurück.
Example.java ist gegeben als:
class Example
{
static
{
System.out.println("Example Loaded");
}
Example()
{
System.out.println("Example Constructed");
}
}
Use.java ist:
import java.lang.reflect.*;
class Use
{
int i;
public static void main(String[] args) throws Exception
{
Class c = Class.forName("Example");
Constructor[] con = c.getDeclaredConstructors();
for(Constructor x: con)
{
System.out.println(x.getName());
}
}
}
Lauf Use.java Ausgänge:
Example Loaded
Example
getClass() ist ein Verfahren, das kann nur mit Objekten verwendet werden. Also wird definitiv vor der Objekterstellung eine Klasse geladen und das Objekt der Class.class wird dafür erstellt.
Nach dem Abschnitt "Class and Data" von http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html, "Immer, wenn wir eine Java-Datei kompilieren, wird der Compiler ein öffentliches, statisches, letztes Feld mit dem Namen class des Typs java.lang.Class in das emited einbetten Bytecode ". Wir können dieses Feld verwenden, wie:
import java.lang.reflect.*;
class Use
{
int i;
public static void main(String[] args) throws Exception
{
Class c = Example.class;
Constructor[] con = c.getDeclaredConstructors();
for(Constructor x: con)
{
System.out.println("Hello "+x.getName());
}
}
}
Ausgabe des obigen Codes ist:
Hello Example
Statische Körper von Beispiel nicht ausgeführt werden sollen. Bedeutet, dass die Klasse Beispiel nicht geladen wurde.
Mein Zweifel ist:
Wenn Klasse dann nicht Gegenstand des Class.class geladen bekommt auch nicht dafür geschaffen bekommen. Dann von wo die Anweisung "Klasse c = Example.class" den Verweis auf Class.class zurückgibt?
siehe die verknüpfte Frage, Ihre Klasse Beispiel wird nicht initialisiert, wenn Sie auf sein statisches Feld zugreifen – AdamSkywalker