java基礎-反射淺析(磨礪營馬劍威java)

【威哥說】本文裏波波老師將帶領你們一塊兒學習一下什麼是反射,文中暫且沒有詳細給你們介紹反射如何去獲取類中的全部屬性和方法,更多的是介紹什麼場景下會使用到反射,使用反射有什麼好處和缺點,你們有本身的理解也能夠相互探討。 反射,一種計算機處理方式。是程序能夠訪問、檢測和修改它自己狀態或行爲的一種能力。 這是百度百科裏的一個說法,我曾經還看到一個對反射的描述爲:在運行狀態中,對於任意一個class類,都能知道此類的全部屬性和方法,對於任意一個對象都能對他的屬性和方法進行調用。那在個人理解來看,就是動態的獲取一個類的全部屬性和方法。這個能夠理解爲反射的概念,或者說做用。java

那麼反射的使用在那些場景中呢?應用場景以下:當程序寫完以後,若是想添加功能,無法直接建立對象(注意:此處是由於一個完整的程序代碼已經成型了,封裝好了,你沒法直接建立對象),可是通常程序會在定義結構時爲了擴展而對外提供接口,因此咱們經過實現這個接口,並在使用時告訴程序類名稱,而後去經過反射找到class文件,並針對其中的元素進行操做;第二就是爲了適應變化,你傳入什麼類型,我對什麼類型進行具體的操做,這類通常用於數據解析。 通常應用: 一、好比java中鏈接數據庫操做時,內部的鏈接操做已經寫好了,若是密碼發生變化,咱們不須要改變原有的代碼邏輯,直接在配置文件中更改便可,這裏登陸操做就是一個已經封裝好的完整的代碼塊,我不但願後續的更改一些東西時會動到我裏面的代碼,此時使用反射,很好的解決了這個問題。 二、好比我們的計算機在設置時會提供對外訪問的USB接口,那麼鏈接USB接口的這一塊操做計算機內部已經封裝好了,不但願外部改動,此時就對外提供了一個訪問的接口,你直接鏈接就好了,這裏也使用到反射。 三、Android中請求網絡數據時,要解析成什麼對象,傳入一個對應的class類型,直接根據類型解析數據...... 可能不少初學者,甚至說開發已經有一年經驗的開發者都有些沒搞懂反射的概念,還有可能有些開發者一直知道這麼去用,可是知其然不知其因此然。那今天講一個簡單的示例來給你們引伸出這個概念。 就拿USB接口這個來講,咱們會在封裝時直接定義一個父類接口 USB,注意:這裏是對外提供的擴展的接口,以下: public interface PCI {數據庫

public void open();安全

public void close();微信

} 而後咱們須要去定義計算機內部的驅動程序,這裏個人驅動程序是一個體系不但願外部來操做,因此電腦內部的驅動代碼你們是沒法調用的,可是具體實現是如何來實現的呢?咱們簡單模擬一下: 首先主板的驅動類: public class Mainboard {網絡

public void run() {性能

System.out.println("main board run....");學習

}對象

public void useUSB(USB u) {接口

if (u != null) {開發

u.open();

u.close();

}

}

}

正常狀況下,每添加一個USB接口,咱們都得從新new一個對象,而後放進去進行使用,以下: //使用一個鼠標的USB

Mainboard mb = new Mainboard();

mb.run();

//每次添加一個設備都須要修改代碼傳遞一個新建立的對象

mb.useUSB(new MouseUSB());

//使用一個鍵盤的USB

這裏又須要修改代碼

mb.useUSB(new KeyBoardUSB());

那若是說像電腦同樣直接把內部封裝好了,不直接讓你去修改代碼可如何是好? 此時咱們就須要反射的知識了,咱們經過接入的USB直接告訴電腦一個類型,也就是說我是什麼類型的,不動你本來的東西,我在外部稍微改動一下便可,那在代碼中該如何體現呢?在java中咱們可使用配置文件的方式來解決這類問題。 好比咱們新建一個usb.properties

在其中保留usb1=MouseUSB.class

在主板中直接定義好處理邏輯,讀取properties文件,並執行全部USB接口:

File configFile = new File("usb.properties");

Properties prop = new Properties();

FileInputStream fis = new FileInputStream(configFile);

prop.load(fis);

for(int x=0; x

String usbName = prop.getProperty("usb"+(x+1));

//經過類名獲得類對象

Class clazz = Class.forName(usbName);//用Class去加載這個usb子類。

//經過類對象的newInstance()方法調用空參的構造方法建立實例

USB u = (USB)clazz.newInstance();

mb.usePCI(u);

}

fis.close();

有了這麼一個定義以後,咱們若是有了後續要添加的USB接口,咱們只須要在配置文件中添加定義便可,如:usb2=KeyBoardUSB.class,就不用去改變原有的邏輯了。 優勢: A:可以運行時動態獲取類的實例,大大提升系統的靈活性和擴展性。 B:與Java動態編譯相結合,能夠實現無比強大的功能 缺點: A:使用反射的性能較低 B:使用反射相對來講不安全 C:破壞了類的封裝性,能夠經過反射獲取這個類的私有方法和屬性 更多內容關注微信公衆號mjw-java或訪問www.moliying.com

相關文章
相關標籤/搜索