透徹分析反射的基礎_Class類

一、反射的基石--->Class類

1. Java類用於描述一類事物的特性,該類事物有什麼屬性,沒有什麼屬性,值域這個屬性的值是什麼,則是由這個類的實例對象來確定的,不同的實例對象有不同的屬性值。Java程序中的各個Java類,他們是否屬於同一類事物,是不是可以用一個類來描述這類事物呢?這個類的名字就是Class,要注意與小寫class關鍵字的區別哦。Class類描述了哪些方面的信息呢?類的名字,類的訪問屬性,類所屬的包名,字段名稱的列表,方法名稱的列表,等等。學習反射,首先就要明白Class這個類。 

 

  • Java程序中的各個Java類屬於同一類事物,描述這類事物的Java類名就是Class
    • public class Class
  • 對比提問:衆多的人用一個什麼類表示?衆多的Java類用一個什麼表示?
    • 人—>Person
    • Java類—>Class
  • 對比提問:Person類代表人,它的實例對象就是張三,李四這樣一個個具體的人,Class類代表Java類,它的各個實例對象分別對應什麼呢?
    • 對應各個類在內存中的字節碼,例如,Person類的字節碼,ArrayList類的字節碼,等等。
    • 一個類被類加載器加載到內存中,佔用一片存儲空間,這個空間裏的內容就是字節碼,不同的類的字節碼是不同的,所以它們在內存中的內容是不同的,這一個個的空間分別用一個個的對象來表示,這些對象顯然具有同樣的類型,這個類型是什麼呢?
  • 如何得到各個字節碼對應的實例對象(Class類型)
    • 類名.class,例如 System.class//通過類名得到字節碼實例
    • 對象.getClass(),例如 new Date().getClass();//通過實例得到字節碼實例
    • Class.forName("類名");     Class.forName("java.util.Date");//適合於類字節碼尚未加載到內存的情況下
      • java.util.Date是一個字符串,如果事先不知道將加載哪個類,就傳一個String,動態的加載字符串指定的類字節碼。

 

  • 八個基本類型和void也對應表現爲自己的Class字節碼對象。
    • Class cls1=int.class;
    • Class cls2=void.class;

 

  • 數組類型 的Class實例對象
    • Class.isArray()
複製代碼
package com.itcast.day1;

public class ReflectTest { 
    public static void main(String[] args)throws Exception { 
        
        //分別用三種方式得到 String類在內存中的字節碼 
        Class cls1=String.class;//01. 類名.class 
        
        String str="123"; 
        Class cls2=str.getClass();//02. 實例.getClass() 
        
        String classUrl="java.lang.String"; 
        Class cls3=Class.forName(classUrl);//03. Class.forName(類名) 
        
        //三種方法是得到了同一份字節碼。 
        System.out.println(cls1 == cls2);//true 
        System.out.println(cls1 == cls3);//true 
        
        System.out.println(cls1.isPrimitive());//false,不是基本類型的字節碼 
        System.out.println(int.class.isPrimitive());//true 基本類型的字節碼 
        System.out.println(int.class == Integer.class);//false 基本類型和包裝類型不是一份字節碼 
        System.out.println(int.class == Integer.TYPE);//true Integer.TYPE就代表包裝對應的基本類型的字節碼 
        
        
        
        System.out.println(int[].class.isPrimitive());//false 數組也是一種類型,但不是基本類型 
        System.out.println(int[].class.isArray());//true 是否是數組 
        
    } 
}
複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章