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

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

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

瀏覽:163日期:2022-08-11 08:52:54
目錄1、靜態代理2、動態代理面試題一:JDK動態代理和CGLIB動態代理區別?面試題二:JDK 動態代理為什么只能對實現了接口的類生成代理?總結 本篇總結的是 代理設計模式,后續會經常更新~ 代理模式最直觀的解釋就是,通過代理,將被代理對象 “增強”!(即,擴展被代理對象的功能) 代理模式分為靜態代理,和動態代理:動態代理的代理類是動態生成的 , 靜態代理的代理類是我們提前寫好的邏輯。 Java 中實現動態代理的方式有 2 種: JDK 動態代理 CGLIB 動態代理1、靜態代理

靜態代理角色分析

抽象角色 :一般使用接口或者抽象類來實現。 真實角色 :被代理的角色。 代理角色: 代理真實角色 , 代理真實角色后 ,一般會做一些附屬的操作。 調用方:使用代理角色來進行一些操作。

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

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

代碼實現

Rent.java 即抽象角色

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

Host.java 即真實角色

// 真實角色: 房東,房東要出租房子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('帶房客看房'); } // 收中介費 public void fare(){ System.out.println('收中介費'); }}

Client.java 調用方,即客戶

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

靜態代理的缺點

需要手動創建代理類,如果需要代理的對象多了,那么代理類也越來越多。

為了解決,這個問題,就有了動態代理 !

2、動態代理

說到動態代理,面試的時候肯定會問動態代理的兩種實現方式:

先來看公共的 UserService 接口,和 UserServiceImpl 實現類:

/** * @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 動態代理

代碼如下

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

輸出結果如下

JDK 動態代理:登錄/登出前邏輯校驗......用戶登錄...JDK 動態代理:登錄/登出后日志打印......==================================JDK 動態代理:登錄/登出前邏輯校驗......用戶推出登錄...JDK 動態代理:登錄/登出后日志打印......

CGLIB 動態代理

代碼如下:

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

測試結果如下

cglib 動態代理:登錄/登出前邏輯校驗......用戶登錄...cglib 動態代理:登錄/登出后日志打印......==================================cglib 動態代理:登錄/登出前邏輯校驗......用戶推出登錄...cglib 動態代理:登錄/登出后日志打印......

面試題一:JDK動態代理和CGLIB動態代理區別?

① JDK 動態代理本質上是實現了被代理對象的接口,而 CGLib 本質上是繼承了被代理對象,覆蓋其中的方法。

② JDK 動態代理只能對實現了接口的類生成代理,CGLib 則沒有這個限制。但是 CGLib 因為使用繼承實現,所以 CGLib 所以無法對 final 、private 方法和 static方法進行代理。

③ JDK 動態代理是 JDK 里自帶的,CGLib 動態代理需要引入第三方的 jar 包。

④ 在調用代理方法上,JDK動態代理是通過反射機制調用,CGLib 是通過 FastClass 機制直接調用。(看過一篇文章,介紹說 FastClass 簡單的理解,就是使用一個 index 下標作為入參,可以直接定位到要調用的方法直接,并進行調用)

在性能上,JDK1.7 之前,由于使用了 FastClass 機制,CGLib 在執行效率上比 JDK 快,但是隨著 JDK 動態代理的不斷優化,從 JDK 1.7 開始,JDK 動態代理已經明顯比 CGLib 更快了。

面試題二:JDK 動態代理為什么只能對實現了接口的類生成代理?

根本原因是通過 JDK 動態代理生成的類已經繼承了 Proxy 類,所以無法再使用繼承的方式去對類實現代理。

總結

文章會不定時更新,有時候一天多更新幾篇,如果幫助您復習鞏固了知識點,還請三連支持一下,后續會一點點的更新!希望大家多多關注好吧啦網的其他內容!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩中文一区二区| 六月婷婷一区| 久久黄色影视| 欧美一区不卡| 久久国产麻豆精品| 国产乱子精品一区二区在线观看| 日韩美女精品| 欧美一区激情| 国产精品视频一区二区三区| 国产精品多人| 国产精品不卡| 日韩专区精品| 亚洲激情黄色| 视频一区二区三区入口| 蜜臀久久久久久久| 天堂va欧美ⅴa亚洲va一国产| 中文一区一区三区免费在线观 | 国产一区二区高清| 久久国产99| 日韩美女国产精品| 国产精品成人国产| 亚洲一级少妇| 国产综合婷婷| 久久av一区| 久久国产日韩欧美精品| 国产中文欧美日韩在线 | 欧美精品自拍| 亚洲一区网站| 日本99精品| 精品久久久亚洲| 欧美日韩精品一区二区视频| 性色av一区二区怡红| 久久国产人妖系列| 日韩高清中文字幕一区二区| 影音先锋国产精品| 日本色综合中文字幕| 里番精品3d一二三区| 亚洲啊v在线| 男人的天堂亚洲一区| 国产日韩欧美一区在线| 黄色aa久久| 亚洲激情婷婷| 91在线成人| 日韩在线观看一区| 亚洲精品伊人| 91日韩欧美| 99视频精品| 国产精品极品国产中出| 国产在线|日韩| 亚洲精品免费观看| caoporn视频在线| 亚洲综合三区| 久久亚洲道色| 蜜桃av一区二区在线观看| 老鸭窝一区二区久久精品| 成人av二区| 国产三级精品三级在线观看国产| 高潮久久久久久久久久久久久久| 日韩制服丝袜先锋影音| 久久久国产精品网站| 精品91久久久久| 国产福利亚洲| 香蕉视频成人在线观看| 高清一区二区| 深夜福利亚洲| 91精品一区二区三区综合| 国产欧美另类| 视频一区中文字幕国产| 水蜜桃精品av一区二区| 亚洲不卡视频| 欧美日韩一区二区综合| 国产精品2023| 久久国产成人| 91tv亚洲精品香蕉国产一区| 欧美日一区二区三区在线观看国产免 | 国产精品久久久久久久久免费高清| 日韩精品免费一区二区三区| 91成人在线网站| 影院欧美亚洲| 成人av三级| 国产精品巨作av| 亚洲中字黄色| 日韩亚洲一区在线| 国产欧美亚洲一区| 丝袜亚洲精品中文字幕一区| 高清在线一区| 国产视频一区二区在线播放| 蜜臀av一区二区在线免费观看 | а√天堂中文在线资源8| 日韩高清三区| 亚洲经典在线| 久久人人97超碰国产公开结果| 国产精品探花在线观看| 乱人伦精品视频在线观看| 日韩成人三级| 麻豆国产一区| 日本a级不卡| 免费看日韩精品| 蜜桃国内精品久久久久软件9| 精品视频在线观看网站| 91精品在线免费视频| 亚洲三区欧美一区国产二区| 一区二区亚洲精品| 91精品国产成人观看| 国产美女高潮在线观看| 精品欧美日韩精品| 国产精品v一区二区三区| 一区二区精彩视频| 亚洲免费一区二区| 欧美一级精品| 国产99亚洲| 999久久久国产精品| www.九色在线| 成人在线超碰| 久久精品二区亚洲w码| 欧美另类中文字幕| 亚洲v天堂v手机在线| 综合激情在线| 丝袜美腿高跟呻吟高潮一区| 鲁大师影院一区二区三区| 久久xxxx| 亚洲一区二区三区在线免费| 久久国产99| 首页亚洲欧美制服丝腿| 伊人成人在线视频| 亚洲免费播放| aa国产精品| 丝袜美腿亚洲色图| 亚洲性视频在线| 婷婷五月色综合香五月| 日本一区二区中文字幕| 亚洲2区在线| 日韩专区视频网站| 日韩av影院| 久久不见久久见免费视频7| 国产伦精品一区二区三区千人斩| 国产精品分类| 国产一区二区三区成人欧美日韩在线观看| 你懂的网址国产 欧美| 欧美国产亚洲精品| 黄色精品视频| 亚洲国产福利| 99久久夜色精品国产亚洲1000部| 日韩视频网站在线观看| 国产一区视频在线观看免费| 99在线精品免费视频九九视| 日韩中文欧美在线| 日本91福利区| 精品亚洲成人| 久久一区二区三区喷水| 免费久久99精品国产自在现线| 亚洲人成亚洲精品| 国产亚洲欧美日韩精品一区二区三区 | 久久国内精品自在自线400部| 国产精品日韩精品中文字幕| 成人国产精品一区二区免费麻豆| 伊人久久国产| 91精品99| 日本天堂一区| 国产资源在线观看入口av| 亚洲欧洲日本mm| 欧美亚洲色图校园春色| av中文资源在线资源免费观看| 在线国产一区| 欧美亚洲三级| 亚洲www啪成人一区二区| 99热精品在线观看| 97久久亚洲| 久久精品播放| 日韩精选在线| 成人av三级| 亚洲日本欧美| 色一区二区三区四区| 香蕉视频成人在线观看| 麻豆精品视频在线| 蜜桃国内精品久久久久软件9| 日韩欧美三区| 中文字幕在线官网| 日韩一区二区三区高清在线观看| 精品国产亚洲日本| 噜噜噜躁狠狠躁狠狠精品视频| 日韩二区在线观看| 电影亚洲精品噜噜在线观看| 四虎精品一区二区免费| 日韩欧美字幕| 日本国产亚洲| 在线日韩av| 国产日产一区| 亚洲精品电影| 精品国产亚洲日本| 免费黄网站欧美| 成人精品国产亚洲| 中文字幕日本一区二区| 日韩一区自拍| 国产精品视频一区视频二区| 在线亚洲精品| 美女久久99| 蜜桃视频在线观看一区| 97视频热人人精品免费| 日韩av不卡一区二区|