java反射機制的作用與優點


java的反射機制就是增加程序的靈活性,避免將程序寫死到代碼里,
例如: 實例化一個 person()對象, 不使用反射, new person(); 如果想變成 實例化 其他類, 那么必須修改源代碼,並重新編譯。
使用反射: class.forName("person").newInstance(); 而且這個類描述可以寫到配置文件中,如 **.xml, 這樣如果想實例化其他類,只要修改配置文件的"類描述"就可以了,不需要重新修改代碼並編譯。
反射其實就是程序能夠自檢查自身信息。就像程序會照鏡子反光看自己。

在程序中可以檢查某個類中的方法屬性等信息,並且能夠動態調用。
這樣可以寫出很靈活的程序。
比如要把一個對象中的數據copy到另外一個對象中,規則是屬性名相同就copy,
就可以用反射來做,不需要指定每個屬性的名字,只要動態從類中取得信息,
再判斷屬性名是否相同即可。當然應用還有很多。

反射可以結合Java的字節碼,使用ASM和cglib等庫,還能動態生成類。
hibernate的延遲載入,spring的AOP都是這么實現的

反射給Java帶來了一些動態性。不過雖然很好,但畢竟還是有一定局限性的。另外ASM,cglib使用還是不放便。因此一些純動態語言現在是一個重要發展趨勢,比如ruby,python等,程序很容易動態生成。
 
         
         
        
增加程序的靈活性。
如struts中。請求的派發控制。
當請求來到時。struts通過查詢配置文件。找到該請求對應的action。已經方法。
然后通過反射實例化action。並調用響應method。
如果不適用反射,那么你就只能寫死到代碼里了。
所以說,一個靈活,一個不靈活。
很少情況下是非用反射不可的。大多數情況下反射是為了提高程序的靈活性。
因此一般框架中使用較多。因為框架要適用更多的情況。對靈活性要求較高。

一、什么是反射:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。這一概念的提出很快引發了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所采用,並在Lisp和面向對象方面取得了成績。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基於反射機制的語言。最近,反射機制也被應用到了視窗系統、操作系統和文件系統中。

反射本身並不是一個新概念,盡管計算機科學賦予了反射概念新的含義。在計算機科學領域,反射是指一類應用,它們能夠自描述和自控制。也就是說,這類應用通過采用某種機制來實現對自己行為的描述(self-representation)和監測(examination),並能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。

二、什么是Java中的類反射:
Reflection 是 Java 程序開發語言的特征之一,它允許運行中的 Java 程序對自身進行檢查,或者說“自審”,並能直接操作程序的內部屬性和方法。Java 的這一能力在實際應用中用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
Reflection 是 Java 被視為動態(或准動態)語言的關鍵,允許程序於執行期 Reflection APIs 取得任何已知名稱之 class 的內部信息,包括 package、type parameters、superclass、implemented interfaces、inner classes, outer class, fields、constructors、methods、modifiers,並可於執行期生成instances、變更 fields 內容或喚起 methods。

三、Java類反射中所必須的類:
Java的類反射所需要的類並不多,它們分別是:Field、Constructor、Method、Class、Object,下面我將對這些類做一個簡單的說明。
Field類:提供有關類或接口的屬性的信息,以及對它的動態訪問權限。反射的字段可能是一個類(靜態)屬性或實例屬性,簡單的理解可以把它看成一個封裝反射類的屬性的類。
Constructor類:提供關於類的單個構造方法的信息以及對它的訪問權限。這個類和Field類不同,Field類封裝了反射類的屬性,而Constructor類則封裝了反射類的構造方法。
Method類:提供關於類或接口上單獨某個方法的信息。所反映的方法可能是類方法或實例方法(包括抽象方法)。 這個類不難理解,它是用來封裝反射類方法的一個類。
Class類:類的實例表示正在運行的 Java 應用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。
Object類:每個類都使用 Object 作為超類。所有對象(包括數組)都實現這個類的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM