Java反射一些筆記 奉上 請笑納! – JAVA編程語言程序開發技術文章

     JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對

於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用

對象的方法的功能稱為java語言的反射機制。

       我們剛剛接觸反射的時候,可能就在想,這個在我們編寫程序的時候,很少用到,到底有什

麼用呢?沒錯,對於普通編程根本就用不到反射,但是有時候我們在網絡上傳給我一個類,

這個類我們事先是不知道的,這個需要動態的加載,這時候就需要瞭,在比如我們都知道

spring struts

       hibernate ibatis這些框架,他們存在的基礎就是:反射。

       我也用過反射,最近在學Java的時候,學到瞭,就寫個筆記記錄下來。

首先說Class類,這裡的C是大寫的,這個是一個類名叫Class的class,這個類也是從Object

        class繼承來的。這個類的實例表示的是Java中的一份字節碼文件。這裡有一點需要註意,這裡

的一份說的是如果這個類有字節碼那麼隻有一份。既然Class是一個類,那麼我們就可以實例化,

我們很自然的就想到瞭new Class(),但是這個在Java中是沒有的。但是在Java的每個類中都提供瞭一個getClass方法,

這個方法的返回值就是一個Class實例。我們還可以使用“類名.class”得到這個對象的字節碼。

這裡還有一點註意,在Java中八個基本數據類型也對應的有字節碼,我們也可以使用int.class

類似的方法,得到基本數據類型的字節碼。還有一個有意思的事就是,我們經常使用的void也

有一份字節碼。

      既然八個基本數據類型都有對應的字節碼,我們知道在Java中對於基本數據類型都提供瞭對應

的封裝類,那麼這兩個的字節碼是同一個嗎?答案是不是,一個基本數據類型,一個是對象。

這裡說句題外話,Java號稱是完全面向對象的,但是還是提供瞭基本數據類型,它們不是對象,

但是在Java1.4以後,我可以把它當成對應的封裝類對象,因為Java提供瞭對於基本數據類型的

自動拆箱和裝箱。但是在Ruby中所有的都是對象包括基本數據類型。

下面我們舉一個例子,驗證上面說的:
 
import java.lang.reflect.Constructor; 
 
public class ReflectTest 

    public static void main(String[] args) throws Exception 
    { 
        //在內存中隻有一份字節碼,我們可以使用同一份字節碼創建不同的對象  
        String str = "abc"; 
        Class cla1 = str.getClass(); 
        Class cla2 = String.class; 
        Class cla3 = Class.forName("java.lang.String"); 
        System.out.println(cla1 == cla2); 
        System.out.println(cla2 == cla3); 
         
        System.out.println(cla1.isPrimitive());//判斷是否是基本數據類型  
        System.out.println(int.class.isPrimitive()); 
        System.out.println(int.class == Integer.class); 
        System.out.println(int.class == Integer.TYPE);//TYPE代表對應的基本類型的字節碼  
        System.out.println(int[].class.isPrimitive());//數組不是原始類型  
        System.out.println(int[].class.isArray());//檢測一份字節碼是否是數組  
    } 
 

true 
true 
false 
true 
false 
true 
false 
true 

發佈留言