1. 程式人生 > >java機制學習——反射,註解,代理,泛型

java機制學習——反射,註解,代理,泛型

java 反射機制在很多地方都有用到。

1、反射的概念:

JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

Java反射機制主要提供了以下功能: 在執行時判斷任意一個物件所屬的類;在執行時構造任意一個類的物件;在執行時判斷任意一個類所具有的成員變數和方法;

在執行時呼叫任意一個物件的方法;生成動態代理。此外,但還有很多地方用到。

、、、

2、註解:註解只是一個標記,必需由另一方來執行某個動作,賦於它含義。 

使用註解主要是在需要使用Spring框架的時候,特別是使用SpringMVC。因為這時我們會發現它的強大之處:預處理。

註解實際上相當於一種標記,它允許你在執行時(原始碼、文件、類檔案我們就不討論了)動態地對擁有該標記的成員進行操作。

實現註解需要三個條件(我們討論的是類似於Spring自動裝配的高階應用):註解宣告、使用註解的元素、操作使用註解元素的程式碼

一般是不需要自己去定義註解的,除非你要自己寫框架類的東西,如果是,註解是配合反射一起用的,通過反射,可以根據class、field、method等物件拿到它上面標註的註解,然後根據有沒有註解、註解的型別或註解上的引數的不同,來執行不同的操作

、、、

3、代理:可以說代理是java十分重要的一種機制,另一個當然是屬於反射了,jdk中單獨講到了反射API(java.lang.reflect),可能有人認為反射對資源消耗比較厲害,確實也是,反射肯定是要消耗資源的,但也不是什麼都要用到反射,所以最佳試驗應該是在資源消耗程度和反射的使用程度之間找到一個平衡點。

代理模式的作用是:為其他物件提供一種代理以控制對這個物件的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。 

Java的動態代理主要涉及兩個類,Proxy和InvocationHandler。

Proxy:提供了一組靜態方法來為一組介面動態地生成代理類及其物件。

InvocationHandler:它是呼叫處理器介面,自定義了一個invok方法,用於集中處理在動態代理類物件上的方法呼叫,通常在該方法中實現對委託類的代理訪問。method.invoke(owner, args):執行該Method.invoke方法的引數是執行這個方法的物件owner,和引數陣列args,可以這麼理解:owner物件中帶有引數args的method方法。返回值是Object,也既是該方法的返回值。

動態代理其實就是Java.lang.reflect.Proxy類動態的根據您指定的所有介面生成一個class byte,該class會繼承Proxy類,並實現所有你指定的介面(您在引數中傳入的介面陣列);然後再利用您指定的classloader將 class byte載入進系統,最後生成這樣一個類的物件,並初始化該物件的一些值,如invocationHandler,以即所有的介面對應的Method成員。 初始化之後將物件返回給呼叫的客戶端。這樣客戶端拿到的就是一個實現你所有的介面的Proxy物件。

實現Java的動態代理,具體有以下四個步驟:

  1. 通過實現InvocationHandler介面建立自己的呼叫處理器

  2. 通過為Proxy類指定ClassLoader物件和一組interface來建立動態代理類

  3. 通過反射機制獲得動態代理類的建構函式,其唯一引數型別是呼叫處理器類介面型別

  4. 通過建構函式建立動態代理類例項,構造時呼叫處理器物件作為引數被傳入

4、泛型:泛型,即“引數化型別”。一提到引數,最熟悉的就是定義方法時有形參,然後呼叫此方法時傳遞實參。那麼引數化型別怎麼理解呢?顧名思義,就是將型別由原來的具體的型別引數化,類似於方法中的變數引數,此時型別也定義成引數形式(可以稱之為型別形參),然後在使用/呼叫時傳入具體的型別(型別實參)。 應用:publicinterface List<E> extends Collection<E>{...}
List<String> list = new ArrayList<String>();
並且還要注意的一點是,Java中沒有所謂的泛型陣列一說。
D