JVM如何判斷類相同

fmms 12年前發布 | 16K 次閱讀 JVM Java開發

      上篇博客中,提到Class生成對象的原理,根據上篇博客的小例子,得出的結果程序中的Class對象是一樣的,是只有一個Class對象.那JVM是如何判斷這三個Class對象其實是一個Class對象呢?

      JVM根據兩個方面判斷:一是類的全稱;另一個是類加載器.

      根據上篇博客中的結果得出:類的全稱是相同的.那類加載器是否相同呢?即使類的全稱相同,而使用的加載器不同,那Class對象也是不同的.那我們繼續上篇博客中的例子,看看所使用的加載器的結果如何呢?其中使用getClassLoad()方法.

/**

 * @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首先判斷內存中是否已經加載該類。判斷的依據就是此篇博客的介紹。

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!