在學(xué)習(xí)Java的過程中會(huì)遇到關(guān)于反射技術(shù)知識(shí)學(xué)習(xí),這個(gè)技術(shù)在學(xué)習(xí)的過程中有一定的難度,今天就和大家一起研究下反射最重要的一個(gè)類Class。
介紹Class類:
在學(xué)習(xí)Java過程中我們知道書寫的任何類、接口、枚舉、注解等程序經(jīng)過JDK中的javac命令編譯之后都會(huì)在指定的硬盤目錄下生成對應(yīng)的class文件(就是字節(jié)碼文件,為了通俗易懂這里稱為class文件)。而這些class文件針對JVM而言就是一類可以直接執(zhí)行的程序文件,學(xué)習(xí)Java面向?qū)ο筮^程中知道,任何存在的事物都可以使用對應(yīng)的類或者接口等形式進(jìn)行封裝描述,同樣道理針對class文件這類事物,在Java中使用了Class類進(jìn)行封裝和描述的(如下圖)。
介紹獲取Class對象:
通過上圖可以知道任何class文件都可以使用Class類進(jìn)行描述封裝,也就是說任何一個(gè)class文件都可以理解成Class類的一個(gè)實(shí)例對象。當(dāng)我們在程序獲取到某個(gè)類的對應(yīng)的class文件本身,其實(shí)就等價(jià)于獲取到Class類的一個(gè)實(shí)例。
Java中提供三種方式可以獲取到Class類的一個(gè)實(shí)例對象(某個(gè)類的class文件對象)。
n 當(dāng)獲取到某個(gè)類的真實(shí)對象,可以使用Object類中的getClass獲取。例如:當(dāng)有一個(gè)Person類的時(shí)候,假設(shè)可以通過new關(guān)鍵字創(chuàng)建出Person對象,就可以通過Person對象調(diào)用getClass獲取到Person的class文件對象。
//演示獲取Class對象的第一種方式 使用Object類中的getClass方法
public static void method_1() {
//創(chuàng)建Person對象
Person p = new Person("上海傳智播客",3);
//獲取Person對象對應(yīng)的class文件(Class對象)
Class clazz = p.getClass();
System.out.println(clazz);
}
n 在Java中的任何類型都有一個(gè)對應(yīng)的靜態(tài)屬性class,可以直接獲取到某個(gè)類型對應(yīng)的class文件(Class對象)。
//獲取Class對象的第二種方式, 使用任何類型中的靜態(tài)成員變量class屬性
public static void method_2() {
//獲取Person的class文件對象
Class clazz = Person.class;
System.out.println(clazz);
//獲取數(shù)組對應(yīng)的class文件對象
Class clazz2 = int[].class;
System.out.println(clazz2);
//獲取基本類型對應(yīng)的class文件對象
Class clazz3 = double.class;
System.out.println(clazz3);
}
n 在我們學(xué)習(xí)Java的過程中,我們知道當(dāng)需要獲取任何類對應(yīng)的對象時(shí)可以使用這個(gè)類的構(gòu)造方法或者這類中的某些靜態(tài)方法等方式獲取,在Class的api中提供了靜態(tài)成員方法forName可以直接獲取到Class對象。
public static void method_3() throws Exception {
//獲取到自定義類的class文件對象
Class clazz = Class.forName("cn.itcast.sh.domain.Person");
System.out.println(clazz);
//獲取JDK中提供的類或接口對應(yīng)的class文件對象
Class clazz2 = Class.forName("java.util.Map");
System.out.println(clazz2);
}
Class對象能干什么?
Class對象它表示的具體的某個(gè)Java源代碼在編譯之后生成的class文件對象,而這個(gè)class文件中就保存著當(dāng)前這個(gè)類或者接口的所有成員信息,因此當(dāng)在程序中獲取到了對應(yīng)的class文件對象(Class對象)就可以動(dòng)態(tài)的去得到這個(gè)類或者接口中描述的成員變量、成員方法、構(gòu)造方法、靜態(tài)代碼塊等成員信息。因此只要在程序能夠獲取到Class對象,就可以去得到任何類中的任何信息。
Java中的反射技術(shù)到底能干什么呢?
反射技術(shù)主要使用在框架等功能性程序的底層,主要的目的是可以提供擴(kuò)展性非常強(qiáng)的通用功能。反射技術(shù)的工作原理也十分的簡單:我們在使用別的功能性程序或者框架時(shí),需要把我們的程序配置在指定的文件(配置文件)中,在運(yùn)行程序時(shí),框架就會(huì)自動(dòng)的去讀取配置文件中的配置信息,通過上述的三種方式種的某一種獲取到對應(yīng)class文件對象,進(jìn)而解析出其中的成員信息,最終讓這些成員信息可以動(dòng)態(tài)的執(zhí)行起來。
如果想知道具體如何獲取class文件中的成員信息,請關(guān)注傳智播客官方論壇或者微信賬號(hào)。