日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java基础 代理

發布時間:2024/9/27 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java基础 代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.代理是什么?

代理(Proxy)是一種設計模式。提供了對目標對象另外的訪問方式,即通過代理對象訪問目標對象。

有一個類我們無法更改,但我們希望在原有類上加上我們自己的邏輯(增強),這時就可以使用代理,使用代理的優點是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標對象的功能。

例子:比如邀請一位明星,那么并不是直接連線邀請明星,而是聯系明星的經紀人來達到同樣的目的,明星就是一個目標對象,他只要負責活動中的節目,而其他瑣碎的事情就交給他的代理人(經紀人)來解決,這就是生活中的一個代理的例子;

用戶和目標對象通過代理對象交互,就像是商家和明星之間通過經紀人交流溝通。

圖例:

?1.1靜態代理

使用靜態代理時,需要定義接口或者父類,被代理對象與代理對象一起實現相同的接口或者是繼承相同的父類。

代碼實例:

接口:TargetInteface.java

/** * 接口類 */ public interface TargetInteface {void method1();void method2();int method3(Integer i); }

目標對象類:Target.java,用來實現接口,實現接口,實現接口中的方法?代理對象類:TargetProxy.java

代理對象類:TargetProxy.java

public class TargetProxy implements TargetInteface {@Overridepublic void method1() {System.out.println("執行方法前...");//在此處填寫自己的業務需求new Target().method1();System.out.println("執行方法后...");}@Overridepublic void method2() {System.out.println("執行方法前...");new Target().method2();System.out.println("執行方法后...");}@Overridepublic int method3(Integer i) {System.out.println("執行方法前...");int method3 = new Target().method3(i);System.out.println("執行方法后...");return method3;} }

測試類:TargetUser.java
public static void main(String[] args) {
? ? TargetInteface target = new TargetProxy();
? ? target.method1();
? ? System.out.println("-----------------------------");
? ? target.method2();
? ? System.out.println("-----------------------------");
? ? System.out.println(target.metho?}

運行結果如下:?

?靜態代理總結:?

1-在不修改目標對象的前提下,對功能目標進行拓展

2-缺點:因為代理對象需要和目標對象實現一樣的接口,所以會有很多代理類,導致類太多;同時一旦接口增加方法,目標對象與代理對象都需要增加維護,使用動態代理解決此缺點;

?1.2 動態代理

特點:

1-代理對象,不需要實現接口;

2-代理對象的生成是利用JDK的API,動態的在內存中構建代理對象(需要我們指定創建代理對象/目標對象實現的接口的類型)

3-動態代理也叫作JDK代理,接口代理;

JDK中生成代理對象的API

代理對象坐在的包:java.lang.reflect.Proxy

JDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數,完整的寫法是:
static Object newProxyInstance(
?ClassLoader loader,//指定當前目標對象使用類加載器,獲取加載器的方法是固定的
?Class<?>[] interfaces,//目標對象實現的接口的類型,使用泛型方式確認類型
?InvocationHandler h )//事件處理,執行目標對象的方法時,會觸發事件處理器的方法,會把當前執行目標對象的方法作為參數傳入

1.2 Cglib代理?

前面說的靜態代理和動態代理模式都是要求目標對象是實現一個接口的目標對象,但是有時候目標對象只是一個單獨的對象,并沒有實現任何的接口,這個時候就可以使用以目標對象子類的方式類實現代理,成為Cglib代理;

Cglib代理,也叫作子類代理,它是在內存中構建一個子類對象從而實現對目標對象功能的擴展.

JDK的動態代理有一個限制,就是使用動態代理的對象必須實現一個或多個接口,如果想代理沒有實現接口的類,就可以使用Cglib實現.
Cglib是一個強大的高性能的代碼生成包,它可以在運行期擴展java類與實現java接口.它廣泛的被許多AOP的框架使用,例如Spring AOP和synaop,為他們提供方法的interception(攔截)
Cglib包的底層是通過使用一個小而塊的字節碼處理框架ASM來轉換字節碼并生成新的類.不鼓勵直接使用ASM,因為它要求你必須對JVM內部結構包括class文件的格式和指令集都很熟悉.
Cglib子類代理實現方法:
1.需要引入cglib的jar文件,但是Spring的核心包中已經包括了Cglib功能,所以直接引入pring-core-3.2.5.jar即可.
2.引入功能包后,就可以在內存中動態構建子類
3.代理的類不能為final,否則報錯
4.目標對象的方法如果為final/static,那么就不會被攔截,即不會執行目標對象額外的業務方法.;

?在Spring的AOP編程中:
如果加入容器的目標對象有實現接口,用JDK代理
如果目標對象沒有實現接口,用Cglib代理

總結

以上是生活随笔為你收集整理的java基础 代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。