教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Java培訓(xùn)實(shí)戰(zhàn)教程之淺談Java反射中的Class類

更新時(shí)間:2015年12月29日13時(shí)37分 來(lái)源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

在學(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)。
 

本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://m.8y3kgpwe.cn/javaee 
 
 
0 分享到:
和我們?cè)诰€交談!