java的反射機制

原文連接:https://www.zhihu.com/question/24304289html

做者:KevinJaz
連接:https://www.zhihu.com/question/24304289/answer/147529485
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

針對題主,從新修改下答案!首先看書要理解反射,很難徹底理解,這關係到Java的語言特性,jvm的內存細節,當初我看反射,就像高票答案那樣,照着寫一遍,結果是你並無理解,你只是照貓畫虎,要想真正理解,我建議題主,不斷深刻探究,當你踩得足夠深回過頭來,你會柳暗花明!java

這裏我不打算像別的答案上來就上代碼,給你講怎麼用,是啥是啥,老實說那樣比較像培訓java程序員的感受,一點對知識的好奇心都沒有,若是是想速成反射的,你們看別的答案吧。mysql

寫答案,可能會有默認知識現象,就是有些知識點,我知道,但你不知道,能夠評論!這裏我試着簡單粗暴地解釋一波!程序員

 


首先咱們瞭解一下JVM,什麼是JVM,Java的虛擬機,java之因此能跨平臺就是由於這個東西,你能夠理解成一個進程,程序,只不過他的做用是用來跑你的代碼的。上圖是java的內存模型,咱們關注的點,一個方法區,一個棧,一個堆,初學的時候老師不深刻的話只告訴你java的內存分爲堆和棧,易懂點吧!spring

假如你寫了一段代碼:Object o=new Object();sql

運行了起來!安全

首先JVM會啓動,你的代碼會編譯成一個.class文件,而後被類加載器加載進jvm的內存中,你的類Object加載到方法區中,建立了Object類的class對象到堆中,注意這個不是new出來的對象,而是類的類型對象,每一個類只有一個class對象,做爲方法區類的數據結構的接口。jvm建立對象前,會先檢查類是否加載,尋找類對應的class對象,若加載好,則爲你的對象分配內存,初始化也就是代碼:new Object()。服務器

上面的流程就是你本身寫好的代碼扔給jvm去跑,跑完就over了,jvm關閉,你的程序也中止了。數據結構

爲何要講這個呢?由於要理解反射必須知道它在什麼場景下使用。oracle

題主想一想上面的程序對象是本身new的,程序至關於寫死了給jvm去跑。假如一個服務器上忽然遇到某個請求哦要用到某個類,哎呀但沒加載進jvm,是否是要停下來本身寫段代碼,new一下,哦啓動一下服務器,(腦殘)!

反射是什麼呢?當咱們的程序在運行時,須要動態的加載一些類這些類可能以前用不到因此不用加載到jvm,而是在運行時根據須要才加載,這樣的好處對於服務器來講不言而喻,舉個例子咱們的項目底層有時是用mysql,有時用oracle,須要動態地根據實際狀況加載驅動類,這個時候反射就有用了,假設 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection這兩個類咱們要用,這時候咱們的程序就寫得比較動態化,經過Class tc = Class.forName("com.java.dbtest.TestConnection");經過類的全類名讓jvm在服務器中找到並加載這個類,而若是是oracle則傳入的參數就變成另外一個了。這時候就能夠看到反射的好處了,這個動態性就體現出java的特性了!舉多個例子,你們若是接觸過spring,會發現當你配置各類各樣的bean時,是以配置文件的形式配置的,你須要用到哪些bean就配哪些,spring容器就會根據你的需求去動態加載,你的程序就能健壯地運行。

答案比較粗糙,點到爲止!

這裏提供一篇比較深刻的博文地址:深刻解析Java反射(1) - 基礎

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二個優秀回答:

做者:meepo
連接:https://www.zhihu.com/question/24304289/answer/150310001
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

今天又被學員問到這個問題了,索性專門作個小知識點來說解反射是怎麼起做用的,發現仍是能夠在不學習Spring等框架的基礎上,舉一些例子來輔助理解反射如何起做用。

鑑於手機知乎上看代碼格式會亂掉,因此代碼都截圖

1. 首先準備兩個很簡單的業務類


 


 


2. 非反射方式切換不一樣的業務方法調用


 


當須要從第一個業務方法切換到第二個業務方法的時候,使用非反射方式,必須修改代碼,而且從新編譯運行,才能夠達到效果

3. 反射方式

使用反射方式,首先準備一個配置文件,就叫作spring.txt吧, 放在src目錄下。 裏面存放的是類的名稱,和要調用的方法名。
在測試類Test中,首先取出類名稱和方法名,而後經過反射去調用這個方法。

當須要從調用第一個業務方法,切換到調用第二個業務方法的時候,不須要修改一行代碼,也不須要從新編譯,只須要修改配置文件spring.txt,再運行便可。


 


 


使用這個例子,能夠較好得理解反射的一個應用場景。

這也是Spring框架的最基本的原理,只是它作的更豐富,安全,健壯。

這個例子若是有興趣本身照着作一遍,我放在這裏:

相關文章
相關標籤/搜索