一、反射
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控制,所以這叫控制反轉。