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

上篇博客中/kf/201202/118910.html,提到Class生成對象的原理,根據上篇博客的小例子,得出的結果程序中的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("—-非靜態的參數初始化—"); 
 
}         
 

/**

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

摘自 廊坊師范學院-梁煥月博客

發佈留言