程序中的Class對象是一樣的,是隻有一個Class對象。那JVM是如何判斷這三個Class對象其實是一個Class對象呢?
JVM根據兩個方面判斷:一是類的全稱;另一個是類加載器。
根據上篇博客中的結果得出:類的全稱是相同的。那類加載器是否相同呢?即使類的全稱相同,而使用的加載器不同,那Class對象也是不同的。那我們繼續上篇博客中的例子,看看所使用的加載器的結果如何呢?其中使用getClassLoad()方法。
[java] /**
* @author: 梁煥月
* 文件名:TestClass.java
* 時間:2012-2-6上午10:01:52
*/
public class TestClass {
public static void main(String[] args)
{
try {
//測試Class.forName()
Class testTypeForName=Class.forName("TestClassType");
System.out.println("testForName——"+testTypeForName);
//測試類加載器
System.out.println("forName形式的加載器——"+testTypeForName.getClassLoader());
//測試類名。class
Class testTypeClass=TestClassType.class;
System.out.println("testTypeClass——"+testTypeClass);
//測試類加載器
System.out.println(".class形式的加載器——"+testTypeClass.getClassLoader());
//測試Object.getClass()
TestClassType testGetClass= new TestClassType();
System.out.println("testGetClass——"+testGetClass.getClass());
//測試類加載器
System.out.println("getClass形式的加載器——"+testGetClass.getClass()。getClassLoader());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class TestClassType{
//構造函數
public TestClassType(){
System.out.println("——構造函數——");
}
//靜態的參數初始化
static{
System.out.println("——靜態的參數初始化——");
}
//非靜態的參數初始化
{
System.out.println("——非靜態的參數初始化——");
}
}
結果如下:
觀察結果發現:三種形式的加載器是相同的。
因此可以說明上篇博客中例子中的三個方式生成的Class對象隻有一個。同樣也證明瞭上篇博客中Class對象生成的原理。JVM首先判斷內存中是否已經加載該類。判斷的依據就是此篇博客的介紹。
作者 sdtarena