JAVA反射機制

JAVA反射機制

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

基本介紹

  • 中文名:JAVA反射機制
  • 外文名:JAVA Reflection
  • 所屬語言:JAVA
  • 屬性:靜態語言
概述,反射機制,簡介,意義,原理,功能,特點,

概述

Java反射機制指的是在Java程式運行狀態中,對於任何一個類,都可以獲得這個類的所有屬性和方法;對於給定的一個對象,都能夠調用它的任意一個屬性和方法。這種動態獲取類的內容以及動態調用對象的方法稱為反射機制。
Java的反射機制允許編程人員在對類未知的情況下,獲取類相關信息的方式變得更加多樣靈活,調用類中相應方法,是Java增加其靈活性與動態性的一種機制。

反射機制

簡介

反射這一概念最早由編程開發人員Smith在1982年提出,主要指應用程式訪問、檢測、修改自身狀態與行為的能力。這一概念的提出立刻吸引了編程界的極大關注,各種研究工作隨之展開,隨之而來引發編程革命,出現了多種支持反射機制的面向對象語言。
在計算機科學領域,反射是指一類能夠自我描述和自控制的套用。在Java程式語言中,反射是一種強有力的工具,是面向抽象編程一種實現方式,它能使代碼語句更加靈活,極大提高代碼的運行時裝配能力。

意義

首先,反射機制極大的提高了程式的靈活性和擴展性,降低模組的耦合性,提高自身的適應能力。
其次,通過反射機制可以讓程式創建和控制任何類的對象,無需提前硬編碼目標類。
再次,使用反射機制能夠在運行時構造一個類的對象,判斷一個類所具有的成員變數和方法,調用一個對象的方法並生成動態代理。
最後,反射機制是構建框架技術的基礎所在,使用反射可以避免將代碼寫死在框架中。
正是反射有以上的特徵,所以它能動態編譯和創建對象,極大的激發了程式語言的靈活性,強化了多態的特性,進一步提升了面向對象編程的抽象能力,因而受到編程界的青睞。

原理

反射機制(Reflection)是Java提供的一項較為高級的功能,它提供了一種動態功能,而此功能的體現在於通過反射機制相關的API就可以獲取任何Java類的包括屬性、方法、構造器、修飾符等信息。元素不必在JⅧ運行時進行確定,反射可以使得它們在運行時動態地進行創建或調用。反射技術在中間件領域套用得較多。

功能

1、獲得某個對象的屬性。
通過getClass()方法獲得某個對象的類,然後實例化一個Field對象,接收類聲明的屬性,最後通過get()方法獲得該屬性的實例,注意,這裡的屬性必須為公有的,否則將會報illegalAeeessException的異常。
JavaJava
2、獲得某個類的靜態屬性。
首先根據類名獲得該類,同獲得某個對象的屬性一樣,通過實例化一個Field對象,接收該類聲明的屬性,不同的是,由於屬性是靜態的,所以直接從類中獲取塒。
3、執行某對象的方法。
同樣要先獲得對象的,然後配置類的數組,並把它作搜尋方法的條件。通過getMethod()方法,得到要執行的方法。執行該invoke方法,該方法中執行的是owner對象中帶有參數args的方法。返回值是一個對象。
4、執行某個類的靜態方法。
基本的原理和“執行某個類的方法”相同,不同點在於method.invoke(null,args),這裡的第一個參數是null,因為調用的是靜態方法,所以不需要藉助owner就能運行。
5、新建類的實例。我們利用執行帶參數的構造函式的方法來新建一個實例。如果不需要參數,可以直接使用newoneClass.newlnstaneeO來實現嘲。同樣要先得到要構造的實例的類,然後構造參數的類數組,構造器是通過getConstructor(argsClass)得到的,最後使用newlnstanee(args)方法新建一個實例。

特點

儘管反射機制帶來了極大的靈活性及方便性,但反射也有缺點。反射機制的功能非常強大,但不能濫用。在能不使用反射完成時,儘量不要使用,原因有以下幾點:
1、性能問題。
Java反射機制中包含了一些動態類型,所以Java虛擬機不能夠對這些動態代碼進行最佳化。因此,反射操作的效率要比正常操作效率低很多。我們應該避免在對性能要求很高的程式或經常被執行的代碼中使用反射。而且,如何使用反射決定了性能的高低。如果它作為程式中較少運行的部分,性能將不會成為一個問題。
2、安全限制。
使用反射通常需要程式的運行沒有安全方面的限制。如果一個程式對安全性提出要求,則最好不要使用反射。
3、程式健壯性。
反射允許代碼執行一些通常不被允許的操作,所以使用反射有可能會導致意想不到的後果。反射代碼破壞了Java程式結構的抽象性,所以當程式運行的平台發生變化的時候,由於抽象的邏輯結構不能被識別,代碼產生的效果與之前會產生差異。

相關詞條

熱門詞條

聯絡我們