最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java基礎(chǔ):反射機制詳解

2020-12-29 14:34 作者:編程大戰(zhàn)  | 我要投稿

一、什么是反射:

(1)Java反射機制的核心是在程序運行時動態(tài)加載類并獲取類的詳細信息,從而操作類或?qū)ο蟮膶傩院头椒?。本質(zhì)是JVM得到class對象之后,再通過class對象進行反編譯,從而獲取t對象的各種信息。

(2)Java屬于先編譯再運行的語言,程序中對象的類型在編譯期就確定下來了,而當程序在運行時可能需要動態(tài)加載某些類,這些類因為之前用不到,所以沒有被加載到JVM。通過反射,可以在運行時動態(tài)地創(chuàng)建對象并調(diào)用其屬性,不需要提前在編譯期知道運行的對象是誰。

二、反射的原理:

下圖是類的正常加載過程、反射原理與class對象:

Class對象的由來是將class文件讀入內(nèi)存,并為之創(chuàng)建一個Class對象。

三、反射的優(yōu)缺點:

1、優(yōu)點:

在運行時獲得類的各種內(nèi)容,進行反編譯,對于Java這種先編譯再運行的語言,能夠讓我們很方便的創(chuàng)建靈活的代碼,這些代碼可以在運行時裝配,無需在組件之間進行源代碼的鏈接,更加容易實現(xiàn)面向?qū)ο蟆?/p>

2、缺點:

  • (1)反射會消耗一定的系統(tǒng)資源,因此,如果不需要動態(tài)地創(chuàng)建一個對象,那么就不需要用反射;

  • (2)反射調(diào)用方法時可以忽略權(quán)限檢查,因此可能會破壞封裝性而導(dǎo)致安全問題。

四、反射的用途:

1、反編譯:.class-->.java

2、通過反射機制訪問java對象的屬性,方法,構(gòu)造方法等

3、當我們在使用IDE,比如Ecplise時,當我們輸入一個對象或者類,并想調(diào)用他的屬性和方法是,一按點號,編譯器就會自動列出他的屬性或者方法,這里就是用到反射。

4、反射最重要的用途就是開發(fā)各種通用框架。比如很多框架(Spring)都是配置化的(比如通過XML文件配置Bean),為了保證框架的通用性,他們可能需要根據(jù)配置文件加載不同的類或者對象,調(diào)用不同的方法,這個時候就必須使用到反射了,運行時動態(tài)加載需要的加載的對象。

5、例如,在使用Strut2框架的開發(fā)過程中,我們一般會在struts.xml里去配置Action,比如

比如我們請求login.action時,那么StrutsPrepareAndExecuteFilter就會去解析struts.xml文件,從action中查找出name為login的Action,并根據(jù)class屬性創(chuàng)建SimpleLoginAction實例,并用Invoke方法來調(diào)用execute方法,這個過程離不開反射。配置文件與Action建立了一種映射關(guān)系,當View層發(fā)出請求時,請求會被StrutsPrepareAndExecuteFilter攔截,然后StrutsPrepareAndExecuteFilter會去動態(tài)地創(chuàng)建Action實例。

比如,加載數(shù)據(jù)庫驅(qū)動的,用到的也是反射。

五、反射機制常用的類:

  • Java.lang.Class;

  • Java.lang.reflect.Constructor;

  • Java.lang.reflect.Field;

  • Java.lang.reflect.Method;

  • Java.lang.reflect.Modifier;

六、反射的基本使用:

1、獲得Class:主要有三種方法:

(1)Object-->getClass

(2)任何數(shù)據(jù)類型(包括基本的數(shù)據(jù)類型)都有一個“靜態(tài)”的class屬性

(3)通過class類的靜態(tài)方法:forName(String className)(最常用)

注意,在運行期間,一個類,只有一個Class對象產(chǎn)生,所以打印結(jié)果都是true;

三種方式中,常用第三種,第一種對象都有了還要反射干什么,第二種需要導(dǎo)入類包,依賴太強,不導(dǎo)包就拋編譯錯誤。一般都使用第三種,一個字符串可以傳入也可以寫在配置文件中等多種方法。

2、判斷是否為某個類的示例:

一般的,我們使用instanceof 關(guān)鍵字來判斷是否為某個類的實例。同時我們也可以借助反射中Class對象的isInstance()方法來判斷是否為某個類的實例,他是一個native方法。

3、創(chuàng)建實例:通過反射來生成對象主要有兩種方法:

(1)使用Class對象的newInstance()方法來創(chuàng)建Class對象對應(yīng)類的實例。

(2)先通過Class對象獲取指定的Constructor對象,再調(diào)用Constructor對象的newInstance()方法來創(chuàng)建對象,這種方法可以用指定的構(gòu)造器構(gòu)造類的實例。

4、通過反射獲取構(gòu)造方法并使用:

(1)批量獲取的方法:
public Constructor[] getConstructors():所有"公有的"構(gòu)造方法
public Constructor[] getDeclaredConstructors():獲取所有的構(gòu)造方法(包括私有、受保護、默認、公有)

(2)單個獲取的方法,并調(diào)用:
public Constructor getConstructor(Class... parameterTypes):獲取單個的"公有的"構(gòu)造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個構(gòu)造方法"可以是私有的,或受保護、默認、公有;

(3) 調(diào)用構(gòu)造方法:

Constructor-->newInstance(Object... initargs)

newInstance是 Constructor類的方法(管理構(gòu)造函數(shù)的類)

api的解釋為:newInstance(Object... initargs) ,使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實例,并用指定的初始化參數(shù)初始化該實例。

它的返回值是T類型,所以newInstance是創(chuàng)建了一個構(gòu)造方法的聲明類的新實例對象,并為之調(diào)用。

例子:

Student類:共六個構(gòu)造方法。

測試類:


控制臺輸出:

5、獲取成員變量并調(diào)用:

Student類:

測試類:


控制臺輸出:


6、獲取成員方法并調(diào)用:

Student類:

測試類:

控制臺輸出:


7、反射main方法:

Student類:

測試類:

控制臺輸出:

8、利用反射創(chuàng)建數(shù)值:

數(shù)組在Java里是比較特殊的一種類型,它可以賦值給一個Object Reference。

9、反射方法的其他使用--通過反射運行配置文件內(nèi)容:

Student類:

配置文件以txt文件為例子:

測試類:


控制臺輸出:

需求:

當我們升級這個系統(tǒng)時,不要Student類,而需要新寫一個Student2的類時,這時只需要更改pro.txt的文件內(nèi)容就可以了。代碼就一點不用改動。

配置文件更改為:

10、反射方法的其他使用--通過反射越過泛型檢查:

泛型用在編譯期,編譯過后泛型擦除(消失掉),所以是可以通過反射越過泛型檢查的

測試類:

控制臺輸出:


2021新的一年,不管你是零基礎(chǔ)的小白,還是想要提升技術(shù)的大牛,在這里有一套【Java實戰(zhàn)進階的學(xué)習資料】, ?為正準備學(xué)習的Java的小伙伴,精心準備的禮物!看一下或許對于你有很大的提升哦!

想要快速的得到這套視頻,小伙伴們只需要 ?點贊+關(guān)注 ?在下方評論:【666】





Java基礎(chǔ):反射機制詳解的評論 (共 條)

分享到微博請遵守國家法律
昌图县| 米林县| 新宾| 桃江县| 通辽市| 怀远县| 巨鹿县| 盐源县| 开化县| 改则县| 吴旗县| 志丹县| 任丘市| 汝阳县| 赫章县| 西安市| 遂昌县| 布尔津县| 泾源县| 蒙自县| 岳阳市| 河北区| 天峨县| 平果县| 通山县| 南平市| 白水县| 蒲城县| 新源县| 绵竹市| 塘沽区| 三江| 连南| 汽车| 巴彦县| 长沙市| 龙井市| 蒙城县| 天门市| 辽宁省| 乐亭县|