亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

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

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

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

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

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

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

代碼實現(xiàn)

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 調(diào)用方,即客戶

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

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

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

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

2、動態(tài)代理

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

先來看公共的 UserService 接口,和 UserServiceImpl 實現(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 動態(tài)代理

代碼如下

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

輸出結(jié)果如下

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

CGLIB 動態(tài)代理

代碼如下:

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

測試結(jié)果如下

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

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

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

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

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

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

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

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

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

總結(jié)

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

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 首页亚洲国产丝袜长腿综合 | 成人毛片网| 26uuu欧美视频在线观看 | 精品久久九九 | 亚洲xx在线 | 91视频免费观看高清观看完整 | 国产精品成人免费视频99 | 日韩中文字幕a | 88国产精品视频一区二区三区 | 免费中文字幕视频 | 欧美视频在线一区二区三区 | 性插免费视频 | 久久精品美女 | 成人亚洲欧美日韩在线 | 成人国产视频在线观看 | 亚洲女精品一区二区三区 | 美国一级毛片在线观看 | 日本在线日本中文字幕日本在线视频播放 | 欧美不卡精品中文字幕日韩 | 亚洲成在人网站天堂一区二区 | 日本一级毛片免费播放 | 日日麻批| 国产在线激情视频 | 国产精品久久国产精品99 gif | 婷婷国产成人久久精品激情 | 欧美久久久久久久一区二区三区 | 婷婷情| 亚洲经典激情春色另类 | 中文字幕久久亚洲一区 | 一级黄色片美国 | 中文字幕第五页 | 亚洲美女毛片 | 一级毛片免费的 | 久久亚洲国产精品一区二区 | 亚洲精品一区在线观看 | 亚洲在线网 | 国产美女网站视频 | 亚洲不卡在线 | 日韩欧美中文字幕在线播放 | 欧美三级在线免费观看 | 香蕉视频免费在线播放 |