一、反射的基石--->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 是否是數組 } }