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