Java反射詳解

一、簡介

Java在編譯時候就必須知道所引用的類所在地方,但是在實際編程中,在某些場合,可能需要引用一個并不在編譯空間的類,這個時候常規(guī)方法就很難實現(xiàn)了。在Java中,Class配合反射能夠很好的解決這種場景。Java里面的反射可以幫助我們在運行程序時候加載、使用編譯期間完全未知的class,簡單來說就是Java可以加載一個運行時候才得知名稱的class,獲得其完整的構(gòu)造,并生成實例化對象,對其成員變量賦值,調(diào)用其方法等等。


二、說明?

反射機制中會用到一些類,在了解反射是如何使用之前,先介紹一下這些類。

Class在反射中表示內(nèi)存中的一個Java類,Class可以代表的實例類型包括,類和接口、基本數(shù)據(jù)類型、數(shù)組

ObjectJava中所有類的超類

Constructor封裝了類的構(gòu)造函數(shù)的屬性信息,包括訪問權(quán)限和動態(tài)調(diào)用信息

Field提供類或接口的成員變量屬性信息,包括訪問權(quán)限和動態(tài)修改

Method提供類或接口的方法屬性信息,包括訪問權(quán)限和動態(tài)調(diào)用信息

Modifier封裝了修飾屬性, public、protected、static、final、synchronized、abstract等。

三、獲取屬性

1、基類或者接口

最基本的,可以通過反射,來獲取一個類的基類或者實現(xiàn)的接口,使用getSuperclass()或者該類的基類,使用getInterfaces()來獲取該類實現(xiàn)的接口。直接看一下例子。

2、構(gòu)造函數(shù)

直接上代碼:

getConstructors():獲取的構(gòu)造函數(shù)全部是public屬性的,不包含父類。

getConstuctor(Class … params):根據(jù)參數(shù),從所有public屬性的構(gòu)造函數(shù)中獲取相關(guān)構(gòu)造函數(shù)。

getDeclaredConstructors():獲取所有的構(gòu)造函數(shù),不包含父類

getDelaredConstructor(Class … params):根據(jù)參數(shù),從所有的構(gòu)造函數(shù)中獲取相關(guān)構(gòu)造函數(shù)。 不包含父類。


3、方法

在Java中,一般通過getMethods()或者getDeclaredMethod()方法來獲取類中定義的方法。直接看一下這二個方法執(zhí)行的例子。


-getMethods()??返回類中所有的public屬性的方法,包括從基類繼承的public方法。

-getDeclaredMethods()??返回類本身聲明的方法,包括復(fù)寫的方法,不包括從基類繼承的方法

-getMethod(name,params)根據(jù)參數(shù)從getMethods()返回的結(jié)果中篩選

-getDeclaredMethod(name, params)根據(jù)參數(shù)從getDeclaredMethods()返回的結(jié)果中篩選


4、成員變量

成員變量獲取和上面類似,主要方法有g(shù)etFields()、getDeclaredFields()、getMethod(name, params)、getDeclaredMethod(name, params)四種方法。


四個方法的具體區(qū)別:

-getFields()? ?獲取類的所有public屬性的成員變量,包括繼承類和基類

-getDeclaredFields()? ?獲取類的所有成員變量(不包含父類和基類等)

-getMethod(name, params)根據(jù)參數(shù)在getFields()獲取的成員變量中進行篩選

-getDeclaredMethod(name, params)根據(jù)參數(shù)在getDeclaredFields()獲取的成員變量中進行篩選

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載注明出處:http://www.itdecent.cn/p/2f488de72886 簡介 Java在編譯時候...
    王三的貓阿德閱讀 1,370評論 0 2
  • 反射(Reflection)能夠讓運行于 JVM 中的程序檢測和修改運行時的行為。 Class類提供了以下方法 四...
    一只好奇的茂閱讀 392評論 0 17
  • 一、什么是反射? “反射(Reflection)能夠讓運行于JVM中的程序檢測和修改運行時的行為。反射用于在運行時...
    Q南南南Q閱讀 520評論 0 1
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,812評論 0 11
  • 今天聽錄音再次聽到了紫雨老師講的關(guān)于借事練心的詳細的解釋,被老師的智慧再次的深深的震撼到了,我當時在去往取...
    憨人崔閱讀 550評論 0 1

友情鏈接更多精彩內(nèi)容