JVM如何判斷類是否相同 – JAVA編程語言程序開發技術文章

程序中的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
 

發佈留言