java反射,IoC&DC

一、反射

JAVA 反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為 java 語言的反射機制。

每個類都有一個?Class?對象,包含了與類有關的信息。當編譯一個新類時,會產生一個同名的 .class 文件,該文件內容保存著 Class 對象。

類加載相當于 Class 對象的加載,類在第一次使用時才動態(tài)加載到 JVM 中。也可以使用?Class.forName("com.mysql.jdbc.Driver")?這種方式來控制類的加載,該方法會返回一個 Class 對象。

反射可以提供運行時的類信息,并且這個類可以在運行時才加載進來,甚至在編譯時期該類的 .class 不存在也可以加載進來。

Class 和 java.lang.reflect 一起對反射提供了支持,java.lang.reflect 類庫主要包含了以下三個類:

Field?:可以使用 get() 和 set() 方法讀取和修改 Field 對象關聯(lián)的字段;

Method?:可以使用 invoke() 方法調用與 Method 對象關聯(lián)的方法;

Constructor?:可以用 Constructor 的 newInstance() 創(chuàng)建新的對象。

反射的優(yōu)點:

可擴展性?:應用程序可以利用全限定名創(chuàng)建可擴展對象的實例,來使用來自外部的用戶自定義類。

類瀏覽器和可視化開發(fā)環(huán)境?:一個類瀏覽器需要可以枚舉類的成員??梢暬_發(fā)環(huán)境(如 IDE)可以從利用反射中可用的類型信息中受益,以幫助程序員編寫正確的代碼。

調試器和測試工具?: 調試器需要能夠檢查一個類里的私有成員。測試工具可以利用反射來自動地調用類里定義的可被發(fā)現(xiàn)的 API 定義,以確保一組測試中有較高的代碼覆蓋率。

反射的缺點:

盡管反射非常強大,但也不能濫用。如果一個功能可以不用反射完成,那么最好就不用。在我們使用反射技術時,下面幾條內容應該牢記于心。

性能開銷?:反射涉及了動態(tài)類型的解析,所以 JVM 無法對這些代碼進行優(yōu)化。因此,反射操作的效率要比那些非反射操作低得多。我們應該避免在經常被執(zhí)行的代碼或對性能要求很高的程序中使用反射。

安全限制?:使用反射技術要求程序必須在一個沒有安全限制的環(huán)境中運行。如果一個程序必須在有安全限制的環(huán)境中運行,如 Applet,那么這就是個問題了。

內部暴露?:由于反射允許代碼執(zhí)行一些在正常情況下不被允許的操作(比如訪問私有的屬性和方法),所以使用反射可能會導致意料之外的副作用,這可能導致代碼功能失調并破壞可移植性。反射代碼破壞了抽象性,因此當平臺發(fā)生改變的時候,代碼的行為就有可能也隨著變化。

https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/basis/%E5%8F%8D%E5%B0%84%E6%9C%BA%E5%88%B6.md

Spring詳解——IoC

IOC-Inversion of Control,即控制反轉。它不是什么技術,而是一種設計思想。

傳統(tǒng)的創(chuàng)建對象的方法是直接通過?new 關鍵字,而 spring 則是通過 IOC 容器來創(chuàng)建對象,也就是說我們將創(chuàng)建對象的控制權交給了 IOC 容器。我們可以用一句話來概括 IOC:

IOC?讓程序員不在關注怎么去創(chuàng)建對象,而是關注與對象創(chuàng)建之后的操作,把對象的創(chuàng)建、初始化、銷毀等工作交給spring容器來做。

舉個前線的栗子說明:

IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC,對于spring框架來說,就是由spring來負責控制對象的生命周期和對象間的關系。這是什么意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看哪里有長得漂亮身材又好的mm,然后打聽她們的興趣愛好、qq號、電話號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然后嘿嘿……這個過程是復雜深奧的,我們必須自己設計和面對每個環(huán)節(jié)。傳統(tǒng)的程序開發(fā)也是如此,在一個對象中,如果要使用另外的對象,就必須得到它(自己new一個,或者從JNDI中查詢一個),使用完之后還要將對象銷毀(比如Connection等),對象始終會和其他的接口或類藕合起來。

  那么IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什么樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然后婚介就會按照我們的要求,提供一個mm,我們只需要去和她談戀愛、結婚就行了。簡單明了,如果婚介給我們的人選不符合要求,我們就會拋出異常。整個過程不再由我自己控制,而是有婚介這樣一個類似容器的機構來控制。Spring所倡導的開發(fā)方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什么東西,你需要什么東西,然后spring會在系統(tǒng)運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創(chuàng)建、銷毀都由?spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現(xiàn)在是所有對象都被spring控制,所以這叫控制反轉。

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

相關閱讀更多精彩內容

  • 反射機制介紹 JAVA 反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象...
    前端三少爺閱讀 975評論 0 0
  • 1-Java基礎 1.1-String和StringBuffer區(qū)別,為什么是可變的,不可變的 String 類中...
    楊慶祥閱讀 1,030評論 0 0
  • 個人博客http://www.milovetingting.cn Java基礎 前言 本文為學習Java相關知識所...
    milovetingting閱讀 272評論 0 1
  • 1. 面向對象與面向過程的區(qū)別 面向過程: 面向過程性能比面向對象高,因為類對象調用需要實例化,開銷比較大,比較消...
    煩人的膽小鬼閱讀 250評論 0 1
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉變要...
    余生動聽閱讀 10,857評論 0 11

友情鏈接更多精彩內容