日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java動態代理靜態代理實例分析

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

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

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

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

接口:Subject包含一個方法

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

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

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

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

package com.example.designpattern.proxy;public class ProxySubject implements Subject {private RealSubject realSubject; //代理角色內部引用了真實角色//代理角色實現目標動作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');}}

客戶調用者

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

靜態代理:

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

優點是:

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

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

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

1. 真實對象與代理類一一對應,增加真實類也要增加代理類,這樣做會快速的增加類的數量,使得系統變得復雜。

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

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

可能你也會說怎么樣實現動態創建實例,以前我們創建實例不都是通過new 的方式來實現的嗎?

Hello hi = new Hello();

那么動態創建實例是由Java提供的功能,就不需要我們去new 對象,他已經定義好了靜態方法Proxy.newProxyInstance(),只要傳入參數調用就可以。Java文檔里面有哦,如圖:

Java動態代理靜態代理實例分析

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

參數解釋:

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

下面看一下動態代理例子代碼:

Subject 接口

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

RealSubject類 實現 Subject 接口

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

動態代理類DynamicSubject 實現了InvocationHandler,重寫invoke()方法

package design.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/*** 該代理類的內部屬性時Object類型,實際使用時,使用該類的構造方法傳遞一個對象* 此外該類還實現了invoke() 方法,該方法中的method.invoke() 其實就是要調用被代理對象的要執行的方法* 方法參數是object,表示該方法從屬于object對象,通過動態代理類,我們可以在執行真是對象的* 方法前后可以加入一些額外的方法*/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() 方法,如果這里不調用的話,不會調用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();//下面的代碼一次性生成代理// 動態生成了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() 是系統自動生成的實例}}

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

InvocationHandler handler = new DynamicSubject(realSubject);

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

解決了靜態代理的難題:1. 真實對象與代理類一一對應,增加真實類也要增加代理類,這樣做會快速的增加類的數量,使得系統變得復雜。 為什么這么說呢, 因為代理類引用的類型是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.使用指定的調用處理程序調用其構造函數。就是使用InvocationHandler 實例調用【要調用方法的那個類】的構造方法*/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);}}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
桃色一区二区| 久久精品一区二区国产| 日韩av福利| 日韩伦理福利| 天堂√8在线中文| 水蜜桃精品av一区二区| 精品国产美女a久久9999| 欧美日韩中文| 欧美日韩中文| 另类综合日韩欧美亚洲| 久久精品国产99国产精品| 精品视频一区二区三区在线观看| 国产精品夜夜夜| 国产亚洲在线观看| 日韩在线一区二区| 蜜臀国产一区二区三区在线播放 | 天堂√8在线中文| 日本在线精品| 亚洲精品国产嫩草在线观看| 久久91导航| 欧美美女一区| 免费在线看一区| 日韩一区免费| 免费亚洲婷婷| 日韩电影免费网站| 日韩视频一区| 亚洲精品看片| 国产精品亚洲欧美| 麻豆视频在线看| 99久久精品国产亚洲精品| 女同性一区二区三区人了人一| 在线视频亚洲| 欧美日韩99| 成人亚洲一区| 欧美午夜精品一区二区三区电影| 欧美日韩国产免费观看| 喷白浆一区二区| 国产精品一区二区三区av麻| 97精品国产一区二区三区| 伊人久久大香线蕉av不卡| 亚洲视频二区| 欧美日韩亚洲国产精品| 中国字幕a在线看韩国电影| 婷婷综合亚洲| 国产乱子精品一区二区在线观看| 人在线成免费视频| 日本大胆欧美人术艺术动态| 久久精品日韩欧美| 亚洲深夜福利| 国产激情久久| 1024精品久久久久久久久| 日韩美女国产精品| 日韩高清欧美| 亚洲乱码一区| 精品国产aⅴ| 在线亚洲一区| 久久亚洲国产精品尤物| 国产婷婷精品| 成人国产精品| 亚洲三级网站| 视频福利一区| 国产亚洲一区| 亚洲激情偷拍| 老牛国内精品亚洲成av人片| 欧美日韩一二| 国产精品99久久久久久董美香| 午夜精品久久久久久久久久蜜桃| 日本一区免费网站| 亚洲午夜久久久久久尤物| 国产精品久久久久久久久久久久久久久 | 午夜欧美精品| 麻豆精品视频在线观看视频| 亚洲欧美日本国产专区一区| 丁香婷婷久久| 亚洲精品婷婷| 亚洲国产综合在线看不卡| 欧美国产精品| 亚洲免费影院| 精品免费av在线| 国产精品丝袜在线播放| 久久电影一区| 免费污视频在线一区| 日本色综合中文字幕| 亚洲精品小说| 日韩亚洲一区在线| 国产精品亚洲综合在线观看| 日韩中文字幕亚洲一区二区va在线| 国产在线观看www| 国产精一区二区| 久久午夜精品一区二区| 欧美日韩免费看片| 麻豆91精品91久久久的内涵| 夜夜精品视频| 久久精品一区二区不卡| 久久精品日韩欧美| 国产精品一区二区三区av麻| 中文不卡在线| 国产亚洲毛片在线| 精品一区毛片| 欧美日韩一区二区三区视频播放| 精品99在线| 免费一级欧美在线观看视频 | 国产精选久久| 91精品一区| 免费人成网站在线观看欧美高清| 久久婷婷av| 成人日韩在线观看| 日韩免费在线| 国产精品国产三级国产在线观看| 欧美日韩一区二区高清| 日韩免费精品| 97精品国产99久久久久久免费| 丝袜诱惑制服诱惑色一区在线观看| 亚洲网站视频| 欧美在线网站| 国产精品日韩欧美一区| 婷婷丁香综合| 免费毛片在线不卡| 午夜国产精品视频免费体验区| 成人免费电影网址| 日韩精品网站| 999久久久国产精品| 久久久噜噜噜| 久久久精品午夜少妇| 久久三级视频| 久久精品99久久无色码中文字幕| 久久久久国产精品一区二区| 韩国精品主播一区二区在线观看 | 欧美日韩激情| 免费黄色成人| 亚洲尤物在线| 男女男精品视频网| 日韩精品视频在线看| 日韩国产欧美在线播放| 日本天堂一区| 国产精品午夜av| 麻豆精品视频在线观看免费| 麻豆国产欧美日韩综合精品二区| 欧美国产极品| 欧美好骚综合网| caoporn视频在线| 久久激情婷婷| 日本蜜桃在线观看视频| 亚洲午夜一级| 亚洲最新av| 国产欧美高清视频在线| 麻豆国产精品视频| 成人福利视频| 国产亚洲毛片在线| 亚洲精品影视| 久久不卡日韩美女| 国产精品成人a在线观看| 久久三级福利| 日韩精品一二三| 国产精品手机在线播放| 麻豆视频在线观看免费网站黄 | 美女免费视频一区| 亚洲啊v在线| 国产亚洲激情| 日本特黄久久久高潮| 国产一区二区三区国产精品| 不卡一二三区| 亚洲一区二区三区无吗| 国产精品v亚洲精品v日韩精品| 色爱综合网欧美| 日韩在线一二三区| 老司机精品视频在线播放| 99视频精品视频高清免费| 综合干狼人综合首页| 欧美1区2区3| 亚洲国内欧美| 日韩欧美2区| 日韩电影在线视频| 亚洲天堂av资源在线观看| 国产精品观看| 婷婷成人在线| 国产欧美一区| 成人日韩在线| 日韩精品高清不卡| 欧美成人精品三级网站| 亚洲精品免费观看| 国产精品成人a在线观看| 玖玖精品视频| 精品三区视频| 亚洲中午字幕| 精品一区二区三区中文字幕| 久久久精品久久久久久96| 日日夜夜免费精品| 日韩欧美1区| 欧美日一区二区三区在线观看国产免 | 日韩综合一区二区| 黄毛片在线观看| 日本成人在线不卡视频| 不卡一二三区| 日本va欧美va精品发布| 日韩免费在线| 国产午夜久久av| 亚洲免费一区二区| 成人在线观看免费视频| 免费精品视频最新在线|