1. 程式人生 > >類名.class Class.forName("類的全路徑") 物件例項.getClass的區別

類名.class Class.forName("類的全路徑") 物件例項.getClass的區別

      首先,三種方式均為獲取該類的一個類物件。那什麼是類物件呢?實際上,在Java中每一個類在被編譯成為.class檔案的時候,JVM(Java虛擬機器)都將會自動對每一個類建立一個類物件,這個類物件包含了這個類的所有的資訊(包括成員變數、方法、構造器)。今後我們在建立這個類的例項或者這個類的物件時都是以這個類的類物件為藍圖(或模板)來構建的,如

Class c =Class.forName("com.ceb.User"); 其中的c 就為Uer類的類物件,而User u=new User();其中u為User的一個類,那麼u就是以c為模板來構建的,也就是說c.newInstance()=u;

   而這三種在構建類的類物件時也存在著一些區別:

1.類名.class ,採用這種方式,JVM使用類載入器將該類載入到記憶體當中(前提是記憶體中還沒有載入該類),但是不會做類的初始化工作,返回Class類的一個類物件;

2.Class.forName("類的全路徑"),其中類的全路徑名為:包+類名,此時JVM在將類載入到記憶體的同時還會做一些靜態的初始化工作,比如使用static修飾的變數,或者static修飾的程式碼塊,返回Class類的一個物件;

3.物件例項.getClass() ,這種方式除了會對類進行靜態初始化外,還能夠進行非靜態初始化。它返回的是在引用執行時真正指向的物件(因為子類物件的引用可能給賦值給父類物件的引用變數,如在多型中)所屬類的一個Class物件;

使用程式碼進行驗證:

如驗證第一種方式:

package com.nantian.util.test;
public class Test {
    public Test(){
    System.out.println("---建構函式--");
    }
    static{
    System.out.println("----靜態引數的初始化---");
    }
    {
    System.out.println("----非靜態引數的初始化----");
    }

}

package com.nantian.util.test;
public class Main {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//測試類名.class
Class c=Test.class;
System.out.println("類名.class-----"+c);
//測試Class.forName("類的全路徑");
Class c1=Class.forName("com.nantian.util.test.Test");
System.out.println("Class.forName('類的全路徑')---"+c1);
//測試類例項.getClass()
Test t=new Test();
Class c2=t.getClass();
System.out.println("類例項.getClass()---"+c2);
}
}

列印的輸出結果為:

類名.class-----class com.nantian.util.test.Test
----靜態引數的初始化---
Class.forName('類的全路徑')---class com.nantian.util.test.Test
----非靜態引數的初始化----
---建構函式--
類例項.getClass()---class com.nantian.util.test.Test

 我們可以發現三者產生的Class物件是一樣的,並且靜態引數的初始化只顯示了一次。

我們知道靜態方法屬性以及靜態程式碼塊的初始化是在類載入時候進行的,而非靜態方法屬性以及程式碼塊初始化是在使用new建立類的例項時候進行的。

因此,我們可以將JVM載入類和建立類物件的過程如下:首先JVM會將位元組碼檔案即.class檔案載入到記憶體中,然後類載入器在記憶體中載入位元組碼檔案,然後在方法區存放生成的class類的類物件。然後在建立物件之前會檢測該類是否在類載入器中已經載入,如果未載入,執行載入過程,如果已經載入了,則直接建立類的例項;

具體的載入與建立的順序可參考一篇部落格:http://blog.csdn.net/glory1234work2115/article/details/50813396

本人也是初學,有問題的地方還望各位大神指正

參考:http://www.cnblogs.com/xuan52rock/p/6443271.html