Java 反射相關(guān)基礎(chǔ)

問:什么是 java 的反射?

答:反射是在運(yùn)行時(shí)而非編譯時(shí)動(dòng)態(tài)獲取類型的信息(譬如接口信息、成員信息、方法信息、構(gòu)造方法信息等)然后依據(jù)這些動(dòng)態(tài)獲取到的信息創(chuàng)建對象、訪問修改成員、調(diào)用方法等。

通過調(diào)用 Class.forName(class) 方法可以訪問返回一個(gè)以指定字符串 class 為類名的類對象,因?yàn)?java 里面任何 class 都要裝載在虛擬機(jī)上才能運(yùn)行,所以那個(gè)方法的作用就是裝載類用的,也可以直接通過 類名.Class 獲取 Class 類對象,還可以通過實(shí)例.getClass() 方法獲取 Class 類對象;

Class 類提供了許多方法,譬如可以獲取與類名稱有關(guān)的信息,可以獲取類中定義的字段 Field(靜態(tài)和實(shí)例變量都被稱為字段,可獲取 public 與非 public 的字段)、Field 也提供了許多獲取字段或者設(shè)置字段具體信息的操作,可以獲取類中定義的方法 Method(靜態(tài)方法和非靜態(tài)方法都是方法,可獲取 public 與非 public 的方法)、Method 也提供了許多獲取方法信息、修飾符、參數(shù)、返回值、注解等、調(diào)用對象方法的操作;

Class.newInstance() 方法可以創(chuàng)建對象實(shí)例(只是用默認(rèn)無參構(gòu)造),不過也提供了一些其他方法獲取所有構(gòu)造方法;

Class 還提供了類型檢查、類型判斷、修飾符、父類、接口、注解、內(nèi)部類等操作的方法。

從 JVM 的角度使用關(guān)鍵字 new 創(chuàng)建一個(gè)類的時(shí)候這個(gè)類可以沒有被加載,但是使用 newInstance() 方法的時(shí)候就必須保證這個(gè)類已經(jīng)加載且這個(gè)類已經(jīng)連接了,而完成上面兩個(gè)步驟是 Class 的靜態(tài)方法 forName() 所完成的,這個(gè)靜態(tài)方法調(diào)用了啟動(dòng)類加載器(即加載 java API 的那個(gè)加載器),所以 newInstance() 實(shí)際上是把 new 這個(gè)方式分解為兩步,即首先調(diào)用 Class 加載方法加載某個(gè)類然后實(shí)例化。

問:簡單說說 java 反射的作用?

答:

  • 反射可以在運(yùn)行時(shí)判斷任意一個(gè)對象所屬的類;

  • 在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;

  • 在運(yùn)行時(shí)調(diào)用任意一個(gè)對象的方法;

  • 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對象;

  • 生成動(dòng)態(tài)代理操作。

問:如何提高反射的效率?反射優(yōu)缺點(diǎn)有哪些?

答:提高反射效率要考慮的問題如下,

  • 首先保證反射 API 最小化,譬如盡量使用 getMethod() 直接獲取而不是 getMethods() 遍歷查找獲取;

  • 其次需要多次動(dòng)態(tài)創(chuàng)建一個(gè)類的實(shí)例時(shí)盡可能地使用緩存。

反射雖然很靈活,有些時(shí)候能夠使得寫的代碼變的大幅精簡,但是在用的時(shí)候一定要注意具體的應(yīng)用場景,因?yàn)?strong>反射的優(yōu)點(diǎn)是能夠運(yùn)行時(shí)動(dòng)態(tài)獲取類的實(shí)例,大大提高系統(tǒng)的靈活性和擴(kuò)展性,與 Java 動(dòng)態(tài)編譯相結(jié)合可以實(shí)現(xiàn)無比強(qiáng)大的功能;而其缺點(diǎn)就是性能相對較低,此外使用反射相對來說不安全,破壞了類的封裝性(可以通過反射獲取這個(gè)類的私有方法和屬性),有些情況下反射受版本兼容問題而不穩(wěn)定(譬如 Android 不同 ROM API 的修改)而難以提前發(fā)現(xiàn)問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評(píng)論 18 139
  • 整理來自互聯(lián)網(wǎng) 1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工具...
    Ncompass閱讀 1,552評(píng)論 0 6
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,686評(píng)論 0 11
  • 現(xiàn)在是周六凌晨1點(diǎn),明天不要上班,雖然比較累,但是還不想睡覺,在萬籟俱寂的深夜沒有汽車的轟鳴聲,沒有工廠嘈雜的喧鬧...
    愛吃果凍閱讀 728評(píng)論 3 2
  • 你在雨中,我在雨中。兩兩相望,兩兩無語。覺得這個(gè)世界只剩下了你我,你為我舞,我為你歌。雨打蘭葉像我陣陣的心...
    冰夫閱讀 292評(píng)論 0 0