代理和JDK的動態代理

一、代理的概念

  動態代理技術是整個java技術中最重要的一個技術,它是學習java框架的基礎,不會動態代理技術,那麼在學習Spring這些框架時是學不明白的。

  動態代理技術就是用來產生一個對象的代理對象的。在開發中爲什麼需要爲一個對象產生代理對象呢?
  舉一個現實生活中的例子:歌星或者明星都有一個自己的經紀人,這個經紀人就是他們的代理人,當我們需要找明星表演時,不能直接找到該明星,只能是找明星的代理人。比如劉德華在現實生活中非常有名,會唱歌,會跳舞,會拍戲,劉德華在沒有出名之前,我們可以直接找他唱歌,跳舞,拍戲,劉德華出名之後,他乾的第一件事就是找一個經紀人,這個經紀人就是劉德華的代理人(代理),當我們需要找劉德華表演時,不能直接找到劉德華了(劉德華說,你找我代理人商談具體事宜吧!),只能是找劉德華的代理人,因此劉德華這個代理人存在的價值就是攔截我們對劉德華的直接訪問!
  這個現實中的例子和我們在開發中是一樣的,我們在開發中之所以要產生一個對象的代理對象,主要用於攔截對真實業務對象的訪問。那麼代理對象應該具有什麼方法呢?代理對象應該具有和目標對象相同的方法

  所以在這裏明確代理對象的兩個概念:
    1、代理對象存在的價值主要用於攔截對真實業務對象的訪問
    2、代理對象應該具有和目標對象(真實業務對象)相同的方法。劉德華(真實業務對象)會唱歌,會跳舞,會拍戲,我們現在不能直接找他唱歌,跳舞,拍戲了,只能找他的代理人(代理對象)唱歌,跳舞,拍戲,一個人要想成爲劉德華的代理人,那麼他必須具有和劉德華一樣的行爲(會唱歌,會跳舞,會拍戲),劉德華有什麼方法,他(代理人)就要有什麼方法,我們找劉德華的代理人唱歌,跳舞,拍戲,但是代理人不是真的懂得唱歌,跳舞,拍戲的,真正懂得唱歌,跳舞,拍戲的是劉德華,在現實中的例子就是我們要找劉德華唱歌,跳舞,拍戲,那麼只能先找他的經紀人,交錢給他的經紀人,然後經紀人再讓劉德華去唱歌,跳舞,拍戲。

二、java中的代理

2.1、"java.lang.reflect.Proxy"類介紹

  現在要生成某一個對象的代理對象,這個代理對象通常也要編寫一個類來生成,所以首先要編寫用於生成代理對象的類。在java中如何用程序去生成一個對象的代理對象呢,java在JDK1.5之後提供了一個"java.lang.reflect.Proxy"類,通過"Proxy"類提供的一個newProxyInstance方法用來創建一個對象的代理對象,如下所示:

1 static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 

  newProxyInstance方法用來返回一個代理對象,這個方法總共有3個參數,ClassLoader loader用來指明生成代理對象使用哪個類裝載器,Class<?>[] interfaces用來指明生成哪個對象的代理對象,通過接口指定,InvocationHandler h用來指明產生的這個代理對象要做什麼事情。所以我們只需要調用newProxyInstance方法就可以得到某一個對象的代理對象了。

2.2、編寫生成代理對象的類

  在java中規定,要想產生一個對象的代理對象,那麼這個對象必須要有一個接口,所以我們第一步就是設計這個對象的接口,在接口中定義這個對象所具有的行爲(方法)

   2.3、Cglib生成代理對象的類

  JDK的動態代理機制只能代理實現了接口的類,而不能實現接口的類就不能實現JDK的動態代理,cglib是針對類來實現代理的,他的原理是對指定的目標類生成一個子類,並覆蓋其中方法實現增強,但因爲採用的是繼承,所以不能對final修飾的類進行代理


具體代碼例子可以參考地址:https://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

相關資料:設計模式之代理模式(二)CGLIB動態代理

CGLIB動態代理介紹(一)




發佈了12 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章