據我所知,每當一個類被加載時,JVM就會爲它創建一個Class.class的對象,該JVM存儲所有加載類的元信息。如何編寫classname.class能夠返回對java.lang.Class對象的引用?
當我們使用forName(「classname」)方法時,它首先加載「classname」,然後爲它創建Class.class對象並返回對創建的Class.class對象的引用。
Example.java被給定爲:
class Example
{
static
{
System.out.println("Example Loaded");
}
Example()
{
System.out.println("Example Constructed");
}
}
Use.java是:
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());
}
}
}
運行Use.java輸出:
Example Loaded
Example
的getClass()是一個方法,該方法只能用於物體。所以在創建對象之前,一定會加載一個類,併爲其創建Class.class的對象。
據「類和數據」的http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html節,「每當我們編譯任何Java文件,編譯器將嵌入在發出一個公共的,靜態的,最終的命名類別字段類型java.lang.Class的,字節碼「。我們可以使用這個字段:以上代碼的
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());
}
}
}
輸出是:
Hello Example
例的靜態身體得不到執行。意味着類的例子沒有被加載。
我的疑問是:
如果類沒有得到加載,然後也沒有得到它創造Class.class的對象。然後從聲明「Class c = Example.class」的語句中返回對Class.class的引用?
查看鏈接問題,您的類當您訪問其靜態字段時,示例未初始化 – AdamSkywalker