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

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

java面試常見模式問題---代理模式

瀏覽:159日期:2022-08-11 08:52:54
目錄1、靜態(tài)代理2、動(dòng)態(tài)代理面試題一:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理區(qū)別?面試題二:JDK 動(dòng)態(tài)代理為什么只能對(duì)實(shí)現(xiàn)了接口的類生成代理?總結(jié) 本篇總結(jié)的是 代理設(shè)計(jì)模式,后續(xù)會(huì)經(jīng)常更新~ 代理模式最直觀的解釋就是,通過代理,將被代理對(duì)象 “增強(qiáng)”!(即,擴(kuò)展被代理對(duì)象的功能) 代理模式分為靜態(tài)代理,和動(dòng)態(tài)代理:動(dòng)態(tài)代理的代理類是動(dòng)態(tài)生成的 , 靜態(tài)代理的代理類是我們提前寫好的邏輯。 Java 中實(shí)現(xiàn)動(dòng)態(tài)代理的方式有 2 種: JDK 動(dòng)態(tài)代理 CGLIB 動(dòng)態(tài)代理1、靜態(tài)代理

靜態(tài)代理角色分析

抽象角色 :一般使用接口或者抽象類來實(shí)現(xiàn)。 真實(shí)角色 :被代理的角色。 代理角色: 代理真實(shí)角色 , 代理真實(shí)角色后 ,一般會(huì)做一些附屬的操作。 調(diào)用方:使用代理角色來進(jìn)行一些操作。

我們以租客租客租房子為例,涉及到的對(duì)象有:租客、中介、房東。(房東即為被代理對(duì)象,中介即為代理對(duì)象)

租客通過中介之手租住房東的房子,代理對(duì)象中介需要尋找租客租房,并從中獲取中介費(fèi)用。

代碼實(shí)現(xiàn)

Rent.java 即抽象角色

// 抽象角色:租房public interface Rent { public void rent();}

Host.java 即真實(shí)角色

// 真實(shí)角色: 房東,房東要出租房子public class Host implements Rent{ public void rent() { System.out.println('房屋出租'); }}

Proxy.java 即代理角色

//代理角色:中介public class Proxy implements Rent { private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } // 租房 public void rent(){ seeHouse(); host.rent(); fare(); } // 看房 public void seeHouse(){ System.out.println('帶房客看房'); } // 收中介費(fèi) public void fare(){ System.out.println('收中介費(fèi)'); }}

Client.java 調(diào)用方,即客戶

// 客戶類,一般客戶都會(huì)去找代理!public class Client { public static void main(String[] args) { // 房東要租房 Host host = new Host(); // 中介幫助房東 Proxy proxy = new Proxy(host); // 你去找中介! proxy.rent(); }}

靜態(tài)代理的缺點(diǎn)

需要手動(dòng)創(chuàng)建代理類,如果需要代理的對(duì)象多了,那么代理類也越來越多。

為了解決,這個(gè)問題,就有了動(dòng)態(tài)代理 !

2、動(dòng)態(tài)代理

說到動(dòng)態(tài)代理,面試的時(shí)候肯定會(huì)問動(dòng)態(tài)代理的兩種實(shí)現(xiàn)方式:

先來看公共的 UserService 接口,和 UserServiceImpl 實(shí)現(xiàn)類:

/** * @author csp * @date 2021-06-03 */public interface UserService { /** * 登錄 */ void login(); /** * 登出 */ void logout();}

/** * @author csp * @date 2021-06-03 */public class UserServiceImpl implements UserService{ @Override public void login() {System.out.println('用戶登錄...'); } @Override public void logout() {System.out.println('用戶推出登錄...'); }}JDK 動(dòng)態(tài)代理

代碼如下

/** * @author csp * @date 2021-06-03 */public class JDKProxyFactory implements InvocationHandler { // 目標(biāo)對(duì)象(被代理對(duì)象) private Object target; public JDKProxyFactory(Object target) {super();this.target = target; } /** * 創(chuàng)建代理對(duì)象 * * @return */ public Object createProxy() {// 1.得到目標(biāo)對(duì)象的類加載器ClassLoader classLoader = target.getClass().getClassLoader();// 2.得到目標(biāo)對(duì)象的實(shí)現(xiàn)接口Class<?>[] interfaces = target.getClass().getInterfaces();// 3.第三個(gè)參數(shù)需要一個(gè)實(shí)現(xiàn)invocationHandler接口的對(duì)象Object newProxyInstance = Proxy.newProxyInstance(classLoader, interfaces, this);return newProxyInstance; } /** * 真正執(zhí)行代理增強(qiáng)的方法 * * @param proxy 代理對(duì)象.一般不使用 * @param method 需要增強(qiáng)的方法 * @param args 方法中的參數(shù) * @return */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println('JDK 動(dòng)態(tài)代理:登錄/登出前邏輯校驗(yàn)......');Object invoke = method.invoke(target, args);System.out.println('JDK 動(dòng)態(tài)代理:登錄/登出后日志打印......');return invoke; } public static void main(String[] args) {// 1.創(chuàng)建對(duì)象UserServiceImpl userService = new UserServiceImpl();// 2.創(chuàng)建代理對(duì)象JDKProxyFactory jdkProxyFactory = new JDKProxyFactory(userService);// 3.調(diào)用代理對(duì)象的增強(qiáng)方法,得到增強(qiáng)后的對(duì)象UserService userServiceProxy = (UserService) jdkProxyFactory.createProxy();userServiceProxy.login();System.out.println('==================================');userServiceProxy.logout(); }}

輸出結(jié)果如下

JDK 動(dòng)態(tài)代理:登錄/登出前邏輯校驗(yàn)......用戶登錄...JDK 動(dòng)態(tài)代理:登錄/登出后日志打印......==================================JDK 動(dòng)態(tài)代理:登錄/登出前邏輯校驗(yàn)......用戶推出登錄...JDK 動(dòng)態(tài)代理:登錄/登出后日志打印......

CGLIB 動(dòng)態(tài)代理

代碼如下:

/** * @author csp * @date 2021-06-03 */public class CglibProxyFactory implements MethodInterceptor { // 目標(biāo)對(duì)象(被代理對(duì)象) private Object target; // 使用構(gòu)造方法傳遞目標(biāo)對(duì)象 public CglibProxyFactory(Object target) {super();this.target = target; } /** * 創(chuàng)建代理對(duì)象 * * @return */ public Object createProxy() {// 1.創(chuàng)建EnhancerEnhancer enhancer = new Enhancer();// 2.傳遞目標(biāo)對(duì)象的classenhancer.setSuperclass(target.getClass());// 3.設(shè)置回調(diào)操作enhancer.setCallback(this);return enhancer.create(); } /** * 真正執(zhí)行代理增強(qiáng)的方法 * @param o 代理對(duì)象 * @param method 要增強(qiáng)的方法 * @param objects 要增強(qiáng)方法的參數(shù) * @param methodProxy 要增強(qiáng)的方法的代理 * @return * @throws Throwable */ @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println('cglib 動(dòng)態(tài)代理:登錄/登出前邏輯校驗(yàn)......');Object invoke = method.invoke(target, objects);System.out.println('cglib 動(dòng)態(tài)代理:登錄/登出后日志打印......');return invoke; } public static void main(String[] args) {// 1.創(chuàng)建對(duì)象UserServiceImpl userService = new UserServiceImpl();// 2.創(chuàng)建代理對(duì)象CglibProxyFactory cglibProxyFactory = new CglibProxyFactory(userService);// 3.調(diào)用代理對(duì)象的增強(qiáng)方法,得到增強(qiáng)后的對(duì)象UserService userServiceProxy = (UserService) cglibProxyFactory.createProxy();userServiceProxy.login();System.out.println('==================================');userServiceProxy.logout(); }}

測試結(jié)果如下

cglib 動(dòng)態(tài)代理:登錄/登出前邏輯校驗(yàn)......用戶登錄...cglib 動(dòng)態(tài)代理:登錄/登出后日志打印......==================================cglib 動(dòng)態(tài)代理:登錄/登出前邏輯校驗(yàn)......用戶推出登錄...cglib 動(dòng)態(tài)代理:登錄/登出后日志打印......

面試題一:JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理區(qū)別?

① JDK 動(dòng)態(tài)代理本質(zhì)上是實(shí)現(xiàn)了被代理對(duì)象的接口,而 CGLib 本質(zhì)上是繼承了被代理對(duì)象,覆蓋其中的方法。

② JDK 動(dòng)態(tài)代理只能對(duì)實(shí)現(xiàn)了接口的類生成代理,CGLib 則沒有這個(gè)限制。但是 CGLib 因?yàn)槭褂美^承實(shí)現(xiàn),所以 CGLib 所以無法對(duì) final 、private 方法和 static方法進(jìn)行代理。

③ JDK 動(dòng)態(tài)代理是 JDK 里自帶的,CGLib 動(dòng)態(tài)代理需要引入第三方的 jar 包。

④ 在調(diào)用代理方法上,JDK動(dòng)態(tài)代理是通過反射機(jī)制調(diào)用,CGLib 是通過 FastClass 機(jī)制直接調(diào)用。(看過一篇文章,介紹說 FastClass 簡單的理解,就是使用一個(gè) index 下標(biāo)作為入?yún)ⅲ梢灾苯佣ㄎ坏揭{(diào)用的方法直接,并進(jìn)行調(diào)用)

在性能上,JDK1.7 之前,由于使用了 FastClass 機(jī)制,CGLib 在執(zhí)行效率上比 JDK 快,但是隨著 JDK 動(dòng)態(tài)代理的不斷優(yōu)化,從 JDK 1.7 開始,JDK 動(dòng)態(tài)代理已經(jīng)明顯比 CGLib 更快了。

面試題二:JDK 動(dòng)態(tài)代理為什么只能對(duì)實(shí)現(xiàn)了接口的類生成代理?

根本原因是通過 JDK 動(dòng)態(tài)代理生成的類已經(jīng)繼承了 Proxy 類,所以無法再使用繼承的方式去對(duì)類實(shí)現(xiàn)代理。

總結(jié)

文章會(huì)不定時(shí)更新,有時(shí)候一天多更新幾篇,如果幫助您復(fù)習(xí)鞏固了知識(shí)點(diǎn),還請(qǐng)三連支持一下,后續(xù)會(huì)一點(diǎn)點(diǎn)的更新!希望大家多多關(guān)注好吧啦網(wǎng)的其他內(nèi)容!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲国产日韩欧美在线| 成人免费网站www网站高清| 99久久夜色精品国产亚洲狼| 精品国产aⅴ| 精品一区电影| 狂野欧美性猛交xxxx| 欧美日韩黄网站| 欧美日韩 国产精品| 国产日产高清欧美一区二区三区 | 91精品国产91久久久久久黑人| 精品精品99| 水蜜桃久久夜色精品一区| 欧美激情另类| 欧美日韩免费观看视频| 99久久婷婷这里只有精品| 国产一区久久| 99视频一区| 亚洲一级大片| 91精品福利观看| 六月丁香综合在线视频| 国产精品久久久久蜜臀| 久久精品成人| 久久中文字幕av| 宅男噜噜噜66国产日韩在线观看| 国产农村妇女精品一二区| 免费看黄色91| 欧美亚洲三级| 久久久国产精品网站| 伊人久久在线| 91国语精品自产拍| 亚洲最新av| 国产伦乱精品| 久草免费在线视频| 亚洲精品一区二区在线看| 亚洲精品在线国产| 久久99国产精品视频| 久久久五月天| 视频一区中文字幕国产| 日本一区中文字幕| 精品国产一区二区三区2021| 日韩成人亚洲| 最新亚洲国产| 国产丝袜一区| 吉吉日韩欧美| 伊人久久成人| 日韩欧美久久| 亚洲永久av| 免费看日韩精品| 久久中文在线| av不卡在线看| 麻豆精品久久久| 久久精品青草| 蜜桃视频在线观看一区| 国产精品99久久免费| 欧美日韩在线播放视频| 亚洲网址在线观看| 国产一区二区三区不卡视频网站 | 亚洲精品在线观看91| 青青草伊人久久| 日本在线啊啊| 日韩国产一二三区| 亚洲欧洲高清| 日日夜夜免费精品视频| 日韩不卡一区| 亚洲aa在线| 成人亚洲一区| 免费在线观看精品| 色婷婷综合网| 亚洲精品美女91| 久久uomeier| 日韩一区二区三区高清在线观看| 日韩黄色大片网站| 日韩av黄色在线| 国产一区日韩一区| 九九九精品视频| 亚洲三级网站| av高清不卡| 国产欧美精品| 美女尤物久久精品| 精品国产免费人成网站| 91精品视频一区二区| 欧美日韩在线网站| 久久中文欧美| 视频精品一区| 91成人超碰| 国产传媒在线| 国产精品中文字幕制服诱惑| 老司机精品久久| 99久久九九| 精品福利久久久| 日韩av中文字幕一区二区三区| 国产一在线精品一区在线观看| **爰片久久毛片| 亚洲自啪免费| 亚洲二区视频| 色一区二区三区四区| 国产黄色一区| 日韩和欧美的一区| 亚洲欧美日韩专区| 亚洲性视频h| 国产高潮在线| 久久久久九九精品影院| 97成人超碰| 亚洲我射av| 亚洲欧洲一区二区天堂久久| 日韩免费小视频| 国产传媒在线观看| 国产精品视频一区视频二区| 少妇精品在线| 蜜臀91精品一区二区三区| 99香蕉国产精品偷在线观看| 激情婷婷久久| 蜜桃精品在线| 伊人久久视频| 中文字幕在线视频久| 国产精品久久久久久久久久久久久久久 | 国产精品99精品一区二区三区∴| 中文一区一区三区免费在线观 | 免费人成在线不卡| 好吊日精品视频| 黑丝美女一区二区| 日韩精品欧美| 国产一区亚洲| 亚洲激情中文| 亚洲视频www| 日韩精品一卡二卡三卡四卡无卡| 国内精品99| 亚洲免费激情| 欧美成人高清| 欧美在线资源| 欧美网站在线| 久久国产66| 日韩在线a电影| 亚洲乱码视频| 欧美一区二区三区久久精品| 久久国产精品免费精品3p| 奇米亚洲欧美| 国产精品激情电影| 精品视频在线你懂得| 国产精品久久久久久久免费观看 | 98精品久久久久久久| 麻豆理论在线观看| 桃色一区二区| 亚洲91久久| 日韩午夜免费| 蜜臀a∨国产成人精品| 日韩高清成人在线| 国产极品嫩模在线观看91精品| 国产精品一区二区免费福利视频| 国产精品66| 日本久久黄色| 免费久久久久久久久| 视频在线观看一区二区三区| 日韩和欧美的一区| 精品三级在线观看视频| 黄色aa久久| 黄色成人91| 日韩高清国产一区在线| 精品国产成人| 狠狠爱成人网| 91亚洲无吗| 久久久久久网| 黄色亚洲大片免费在线观看| 日韩精品一级二级| 国产精品一线| 久久久亚洲一区| 一区二区三区网站| 久久久久伊人| 午夜精品影院| 日韩avvvv在线播放| 久久久久久婷| 国产精品毛片| 欧美精品aa| 久久精品高清| 日韩国产91| yellow在线观看网址| 精品1区2区3区4区| 日韩国产一二三区| 国产精品精品国产一区二区| 红桃视频国产精品| 国产精品夜夜夜| 欧美色图国产精品| 日韩不卡一二三区| 成人啊v在线| 婷婷精品在线观看| 最近高清中文在线字幕在线观看1| 日韩网站在线| 久久字幕精品一区| 老色鬼久久亚洲一区二区| 麻豆精品国产91久久久久久| 91久久国产| 国产精久久久| 亚洲欧洲一区二区天堂久久| 国产日本精品| 蜜桃一区二区三区| 国产精品亚洲欧美一级在线| 久久在线免费| 欧美一区二区三区久久精品| 久久精品99久久无色码中文字幕| 欧美日韩午夜电影网|