成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

Java動態(tài)代理靜態(tài)代理實例分析

瀏覽:25日期:2022-09-04 13:55:29

代理模式:為其他對象提供一種代理以控制某個對象的訪問。用在:在某些情況下,一個客戶不想或者不能直接訪問另一個對象,而代理對象可以在客戶端和目標對象之前起到中介的作用,代理對象還可以完成它附加的操作。

例子:就像房東、租客、中介的關(guān)系。中介(代理對象)為房東(真實對象)出租房子,租客(客戶)通過中介(代理對象)來找房子租房子,中介完成了租房以后可以收取中介費(附加操作)。

先看看靜態(tài)代理模式,通過上面對代理模式的理解,可以了解到代理模式:即不直接通過new一個真實對象來調(diào)用方法,而是通過代理對象來調(diào)用一個方法,所以代理對象包含真實對象的引用。下面看一下代碼

接口:Subject包含一個方法

package com.example.designpattern.proxy; public interface Subject { void request(); }

RealSubject類,實現(xiàn)了Subject接口,為了簡單起見,方法簡單的輸出一句話:

package com.example.designpattern.proxy;public class RealSubject implements Subject {//真是角色實現(xiàn)了public void request() {System.out.println('From real subject');}}

代理類ProxySubject,也要實現(xiàn)Subject接口,實現(xiàn)Subject里面的方法,但是在這里里面是通過調(diào)用真實對象來實現(xiàn)的。

package com.example.designpattern.proxy;public class ProxySubject implements Subject {private RealSubject realSubject; //代理角色內(nèi)部引用了真實角色//代理角色實現(xiàn)目標動作public void request() {this.preRequest(); //在真實角色操作之前所附加的操作if (realSubject == null){realSubject = new RealSubject();}realSubject.request(); // 真實角色所完成的事情this.afterRequet(); //在真實角色操作之后附加的操作}//代理角色之前完成的動作private void preRequest(){System.out.println('pre request');}//代理角色之后完成的動作private void afterRequet(){System.out.println('after request');}}

客戶調(diào)用者

package com.example.designpattern.proxy;public class Client {public static void main(String[] args) {ProxySubject proxy = new ProxySubject();//通過代理對象來調(diào)用方法proxy.request(); }}

靜態(tài)代理:

可以運行一下這些代碼哦, 可以在Client類中看到,是通過代理ProxySubject的對象proxy來調(diào)用方法的,在代理類ProxySubject中,有一個真實對象的引用,在代理對象的中request()方法調(diào)用了真實對象的方法。這樣的模式叫做代理模式。

優(yōu)點是:

1. 代理模式能將代理對象與真實對象被調(diào)用的目標對象分離。

2. 一定程度上降低了系統(tǒng)的耦合度,擴展性好。

代理類中包含了對真實主題的引用,這樣做也有缺點:

1. 真實對象與代理類一一對應(yīng),增加真實類也要增加代理類,這樣做會快速的增加類的數(shù)量,使得系統(tǒng)變得復(fù)雜。

2. 設(shè)計代理以前真實主題必須事先存在,不太靈活。

采用動態(tài)代理可以解決以上問題,動態(tài)代理是相對于靜態(tài)代理來說的。

可能你也會說怎么樣實現(xiàn)動態(tài)創(chuàng)建實例,以前我們創(chuàng)建實例不都是通過new 的方式來實現(xiàn)的嗎?

Hello hi = new Hello();

那么動態(tài)創(chuàng)建實例是由Java提供的功能,就不需要我們?nèi)ew 對象,他已經(jīng)定義好了靜態(tài)方法Proxy.newProxyInstance(),只要傳入?yún)?shù)調(diào)用就可以。Java文檔里面有哦,如圖:

Java動態(tài)代理靜態(tài)代理實例分析

Java標準庫提供了一種動態(tài)代理(DynamicProxy)的機制:可以在運行期動態(tài)創(chuàng)建某個interface的實例。

參數(shù)解釋:

Proxy.newProxyInstance( ClassLoader loader, // 傳入ClassLoader Class<?>[] interfaces, // 傳入要調(diào)用的接口的方法數(shù)組 InvocationHandler h); //傳入InvocationHandler 的實例

下面看一下動態(tài)代理例子代碼:

Subject 接口

package design.dynamicproxy;public interface Subject {void request(String str);}

RealSubject類 實現(xiàn) Subject 接口

package design.dynamicproxy;public class RealSubject implements Subject {@Overridepublic void request(String str) {System.out.println('From Real Subject!' + ' args:' + str );}}

動態(tài)代理類DynamicSubject 實現(xiàn)了InvocationHandler,重寫invoke()方法

package design.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/*** 該代理類的內(nèi)部屬性時Object類型,實際使用時,使用該類的構(gòu)造方法傳遞一個對象* 此外該類還實現(xiàn)了invoke() 方法,該方法中的method.invoke() 其實就是要調(diào)用被代理對象的要執(zhí)行的方法* 方法參數(shù)是object,表示該方法從屬于object對象,通過動態(tài)代理類,我們可以在執(zhí)行真是對象的* 方法前后可以加入一些額外的方法*/public class DynamicSubject implements InvocationHandler {//引入的類型是Object的,可以隨便傳入任何一個對象private Object object;public DynamicSubject(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println('before calling:' + method);//等價于realSubject的request() 方法,如果這里不調(diào)用的話,不會調(diào)用Method 對象中的方法method.invoke(object, args);System.out.println('after calling:' + method);return null;}}

Client類

package design.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class Client {public static void main(String[] args) {RealSubject realSubject = new RealSubject();InvocationHandler handler = new DynamicSubject(realSubject);Class<?> classType = handler.getClass();//下面的代碼一次性生成代理// 動態(tài)生成了class com.sun.proxy.$Proxy0 的實例,Subject subject = (Subject) Proxy.newProxyInstance(classType.getClassLoader(), realSubject.getClass().getInterfaces(),handler);subject.request('eather');System.out.println(subject.getClass());//輸出class com.sun.proxy.$Proxy0,可以看到Proxy.newProxyInstance() 是系統(tǒng)自動生成的實例}}

在Client中可以看到,我們這里調(diào)用方法的是 subject.request('eather'); 這個對象subject 不是通過new DynamicSubject()生成的,而是Java內(nèi)部寫好的方法在運行時動態(tài)生成對象;可能有人說

InvocationHandler handler = new DynamicSubject(realSubject);

這里不是通過new new DynamicSubject(realSubject); 生成了一個對象嗎? 是的,但是它是InvocationHandler 類型的,主要是傳遞一個InvocationHandler類型參數(shù)給Proxy.newProxyInstance(); 即最后一個參數(shù)。通過Client類的最后一句輸出可以看到它是 class com.sun.proxy.$Proxy0 ,這是Java運行時生成的。

解決了靜態(tài)代理的難題:1. 真實對象與代理類一一對應(yīng),增加真實類也要增加代理類,這樣做會快速的增加類的數(shù)量,使得系統(tǒng)變得復(fù)雜。 為什么這么說呢, 因為代理類引用的類型是Object的,可以隨便傳入任何一個對象,當真實類增加時,代理類不用增加,new DynamicSubject(object); new的時候把要傳入的對象傳進去即可。

下面是Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h); 這個方法的源碼啦,可以看看,深入了解一下

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException{Objects.requireNonNull(h);final Class<?>[] intfs = interfaces.clone();final SecurityManager sm = System.getSecurityManager();if (sm != null) {checkProxyAccess(Reflection.getCallerClass(), loader, intfs);}/** Look up or generate the designated proxy class.生成一個代理類對象*/Class<?> cl = getProxyClass0(loader, intfs);/** Invoke its constructor with the designated invocation handler.使用指定的調(diào)用處理程序調(diào)用其構(gòu)造函數(shù)。就是使用InvocationHandler 實例調(diào)用【要調(diào)用方法的那個類】的構(gòu)造方法*/try {if (sm != null) {checkNewProxyPermission(Reflection.getCallerClass(), cl);}final Constructor<?> cons = cl.getConstructor(constructorParams);final InvocationHandler ih = h;if (!Modifier.isPublic(cl.getModifiers())) {AccessController.doPrivileged(new PrivilegedAction<Void>() {public Void run() {cons.setAccessible(true);return null;}});}return cons.newInstance(new Object[]{h});}catch (IllegalAccessException|InstantiationException e) {throw new InternalError(e.toString(), e);}catch (InvocationTargetException e) {Throwable t = e.getCause();if (t instanceof RuntimeException) {throw (RuntimeException) t;} else {throw new InternalError(t.toString(), t);}}catch (NoSuchMethodException e) {throw new InternalError(e.toString(), e);}}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
色综合 综合色| 久久综合伊人| 国产视频亚洲| 国产婷婷色一区二区三区四区| 黄色成人免费在线| 国产日韩欧美一区在线 | 欧美三级中文字幕在线观看| 曰韩精品一区二区| 亚洲性视频h| 色综合天天做天天爱| 3d动漫精品啪啪1区2区免费| 日产国产高清一区二区三区| 国产精品久久久对白| 国产成人自拍高清视频在线免费播放| 色成人在线视频| 成人免费观看av| 美女脱光内衣内裤视频久久影院| 在线观看国产一区二区| 日韩欧美在线观看一区二区三区| 国产成人午夜精品影院观看视频| 在线观看91精品国产麻豆| 国产精品sm| 国产精品人人做人人爽人人添| 亚洲视频www| 亚洲巨乳在线| 成人欧美一区二区三区视频网页 | caoporn国产精品| 日韩欧美中文一区二区| 国内精品伊人久久久久av影院 | 国产亚洲一区二区在线观看| 99久久国产综合精品色伊 | 亚洲一二三区在线观看| 99精品国产一区二区青青牛奶| 亚洲免费在线播放| 亚洲精品影院| 亚洲成人av一区二区三区| 国产精品一区二区三区观看| 亚洲乱码中文字幕| 国产麻豆综合| 日日摸夜夜添夜夜添国产精品| 在线一区二区视频| 久久99国产乱子伦精品免费| 7777精品久久久大香线蕉| 久久国产麻豆精品| 欧美一卡2卡三卡4卡5免费| 成人精品小蝌蚪| 久久久久高清精品| 欧美日本国产精品| 一区二区三区精密机械公司| 欧美一进一出视频| 美女网站视频久久| 精品日韩99亚洲| 91麻豆免费观看| 国产精品欧美经典| 国产日韩精品久久| 午夜精品aaa| 91精品国产综合久久精品图片| 97精品久久久久中文字幕| 国产精品私房写真福利视频| 亚洲欧洲一区二区在线观看| 五月天亚洲婷婷| 这里只有精品免费| 91在线观看美女| 亚洲天堂2016| 91福利社在线观看| 国产激情视频一区二区三区欧美| www国产精品av| 狠狠久久婷婷| 日本亚洲最大的色成网站www| 欧美精品乱人伦久久久久久| 欧美二区在线| 亚洲午夜精品在线| 在线成人午夜影院| 午夜精品电影| 香蕉成人啪国产精品视频综合网| 欧美另类高清zo欧美| 久久免费国产精品| 国产精品一区毛片| 黄页网站大全一区二区| 欧美国产一区二区| 久久久久久国产精品mv| 成人免费福利片| 亚洲欧洲性图库| 日本韩国一区二区三区| 成人免费黄色在线| 亚洲精品写真福利| 欧美精品v国产精品v日韩精品 | 国产午夜精品一区二区三区嫩草| 99国产精品99久久久久久粉嫩| 精品无人码麻豆乱码1区2区| 国产三级三级三级精品8ⅰ区| 亚洲综合精品四区| 国产精品69毛片高清亚洲| 日本高清不卡一区| 成人国产精品免费网站| 亚洲乱码国产乱码精品精的特点 | 精品奇米国产一区二区三区| 99热在线精品观看| 国产精品18久久久久久久网站| 亚洲欧美视频一区| 91精品国产综合久久福利| 国产日韩欧美| 成人99免费视频| 亚洲成av人在线观看| 色成人在线视频| 欧美日韩国产精品一卡| 久久蜜桃精品| 91浏览器在线视频| 日本三级亚洲精品| 国产欧美日本一区视频| 欧美日韩一区二区在线观看 | 欧美日韩电影在线| 亚洲国产精品视频一区| 风间由美一区二区av101 | 午夜精品久久久久久久| 国产人妖乱国产精品人妖| 久久亚洲欧洲| aaa欧美大片| 日本伊人午夜精品| 国产精品国产三级国产普通话三级| 欧美四级电影在线观看| 精品99视频| 高清在线不卡av| 日本亚洲一区二区| 亚洲色欲色欲www| 精品福利一二区| 欧美亚洲一区二区在线| 在线观看欧美一区| 豆国产96在线|亚洲| 日本sm残虐另类| 综合久久一区二区三区| 日本aⅴ亚洲精品中文乱码| 国产精品网友自拍| 日韩欧美一区中文| 色999日韩国产欧美一区二区| 黑人一区二区三区四区五区| 成人午夜私人影院| 久久精品72免费观看| 一区二区视频在线看| 中文欧美字幕免费| 欧美一级免费大片| 色婷婷av一区二区| 国产午夜精品一区二区三区欧美 | 看电视剧不卡顿的网站| 久久久久综合网| 69久久夜色精品国产69蝌蚪网| 亚洲一区影院| 黄色综合网站| 欧美呦呦网站| 99re在线精品| 成人妖精视频yjsp地址| 激情综合色播五月| 免费观看一级欧美片| 天堂精品中文字幕在线| 亚洲欧美经典视频| 国产精品你懂的在线| 精品国产污污免费网站入口| 欧美日韩免费视频| 91久久精品日日躁夜夜躁欧美| 国产伦精品一区二区三区| 亚洲午夜精品久久| 黄色工厂这里只有精品| 欧美成人日本| 99这里只有久久精品视频| 国产乱码精品一区二区三| 免费国产亚洲视频| 久草热8精品视频在线观看| 亚洲成av人片| 亚洲一区av在线| 亚洲在线中文字幕| 亚洲精品视频一区| 一区二区三区四区在线免费观看| 国产精品久久久久精k8| 国产精品区一区二区三| 久久精品人人做| 国产午夜精品一区二区三区视频| 精品伦理精品一区| 日韩女优电影在线观看| 欧美一区欧美二区| 欧美一级爆毛片| 欧美一级欧美三级| 精品国产sm最大网站免费看| 久久人人97超碰com| 国产日韩一级二级三级| √…a在线天堂一区| 中文字幕日本乱码精品影院| 亚洲欧洲三级电影| 亚洲综合色视频| 天使萌一区二区三区免费观看| 日本欧美韩国一区三区| 国产一区二区在线观看视频| 粉嫩13p一区二区三区| 99久久精品国产导航| 国产精品国产三级国产专区53| 一色屋精品视频在线观看网站| 亚洲高清视频一区| 免费看亚洲片| 欧美日韩色综合| 精品久久人人做人人爽| 国产精品伦一区二区三级视频|