电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:98日期: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
相關文章:
主站蜘蛛池模板: 锥形螺带干燥机(新型耙式干燥机)百科-常州丰能干燥工程 | 华中线缆有限公司-电缆厂|电缆厂家|电线电缆厂家 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 南昌旅行社_南昌国际旅行社_南昌国旅在线| 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 深圳办公室装修-写字楼装修设计-深圳标榜装饰公司 | 众能联合-提供高空车_升降机_吊车_挖机等一站工程设备租赁 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 无刷电机_直流无刷电机_行星减速机-佛山市藤尺机电设备有限公司 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | 搪玻璃冷凝器_厂家-越宏化工设备| 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 微动开关厂家-东莞市德沃电子科技有限公司 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 【北京写字楼出租_写字楼租赁_办公室出租网/出售】-远行地产官网 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 常州翔天实验仪器厂-恒温振荡器-台式恒温振荡器-微量血液离心机 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 据信,上课带着跳 D 体验-别样的课堂刺激感受引发网友热议 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 |