Class對象的生成方式如下:
1.類名.class 說明: JVM將使用類裝載器, 將類裝入內(nèi)存(前提是:類還沒有裝入內(nèi)存),不做類的初始化工作.返回Class的對象
2.Class.forName("類名字符串") (注:類名字符串是包名+類名) 說明:裝入類,并做類的靜態(tài)初始化卡啰,返回Class的對象
3.實(shí)例對象.getClass() 說明:對類進(jìn)行靜態(tài)初始化览芳、非靜態(tài)初始化钞楼;返回引用運(yùn)行時(shí)真正所指的對象(因?yàn)?子對象的引用可能會賦給父對象的引用變量中)所屬的類的Class的對象
通過下面的程序,來觀察一下Class對象的生成的原理懦窘。
package ClassTest;
public class TestClassType {
// 構(gòu)造函數(shù)
public TestClassType() {
System.out.println("----構(gòu)造函數(shù)---");
}
// 靜態(tài)的參數(shù)初始化
static {
System.out.println("---靜態(tài)的參數(shù)初始化---");
}
// 非靜態(tài)的參數(shù)初始化
{
System.out.println("----非靜態(tài)的參數(shù)初始化---");
}
}
package ClassTest;
public class TestClass {
public static void main(String[] args) {
try {
// 測試.class
@SuppressWarnings("rawtypes")
Class testTypeClass = TestClassType.class;
System.out.println("testTypeClass---" + testTypeClass);
// 測試Class.forName()
@SuppressWarnings("rawtypes")
Class testTypeForName = Class.forName("ClassTest.TestClassType");
System.out.println("testTypeForName---" + testTypeForName);
// 測試Object.getClass()
TestClassType testTypeGetClass = new TestClassType();
System.out.println("testTypeGetClass---"
+ testTypeGetClass.getClass());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果如下
testTypeClass---class ClassTest.TestClassType
---靜態(tài)的參數(shù)初始化---
testTypeForName---class ClassTest.TestClassType
----非靜態(tài)的參數(shù)初始化---
----構(gòu)造函數(shù)---
testTypeGetClass---class ClassTest.TestClassType
根據(jù)結(jié)果可以發(fā)現(xiàn),三種生成的Class對象一樣的稚配。并且程序只打印一次“靜態(tài)的參數(shù)初始化”畅涂。
我們知道,靜態(tài)的方法屬性初始化道川,是在加載類的時(shí)候初始化午衰。而非靜態(tài)方法屬性初始化,是new類實(shí)例對象的時(shí)候加載愤惰。
因此苇经,這段程序說明,三種方式生成Class對象宦言,其實(shí)只有一個Class對象扇单。在生成Class對象的時(shí)候,首先判斷內(nèi)存中是否已經(jīng)加載奠旺。
所以蜘澜,生成Class對象的過程其實(shí)是如此的:
當(dāng)我們編寫一個新的java類時(shí),JVM就會幫我們編譯成class對象,存放在同名的.class文件中施流。在運(yùn)行時(shí),當(dāng)需要生成這個類的對象鄙信,JVM就會檢查此類是否已經(jīng)裝載內(nèi)存中瞪醋。若是沒有裝載,則把.class文件裝入到內(nèi)存中装诡。若是裝載银受,則根據(jù)class文件生成實(shí)例對象。
轉(zhuǎn)自: http://blog.csdn.net/zhangxichao100/article/details/51104971