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

全國咨詢/投訴熱線:400-618-4000

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

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

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

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