代理模式(JDK、CGLIB)
前述
代理模式(Proxy)是一个重要的设计模式,提供了对目标对象另外的访问方式(即通过代理来访问对象)。
举例:我们可以理解为代理权,如各大药材公司生产的药品,一般不会是公司自己零散售出,在个体病人与生产商之间会有一个代理商,代理商负责与公司沟通批量购入,然后再零散出售给病人,因而病人想要访问生产商需先与代理商沟通。也可以考虑(NBA球星——经纪人——球队)三者的关系;
优势:
(1)可以在目标对象实现的基础上,增加额外的功能操作(扩展目标对象的功能);
(2)职责更加清楚,更加智能化;
代理模式的关键在于:代理对象和目标对象;
一般分为动态代理和静态代理。
静态代理
条件:代理对象需是实现与目标对象一样的的接口
优点:可以做到在不修改目标对象功能的前提下,对目标对象的功能进行扩展;
缺点:
(1)代理对象与目标对象接口一致,导致所实行的类过于繁多。
(2)一旦接口增加方法,目标对象和代理对象都需要实现与维护。
动态代理
(1)代理对象不需要实现接口
(2)包含JDK代理、CGLIB代理
- JDK代理
JDK中生成代理的API:
proxy:被代理的类的实例
method:调用被代理的类的方法
args:该方法需要的参数
public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),目标对象的类加载器target.getClass().getInterfaces(),目标对象的接口new InvocationHandler() {//事件处理器@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//执行目标对象的方法Object returnValue = method.invoke(proxy, args);return returnValue;}});}
}
//在main函数中调用该方法(getProxyInstance())
- CGLIB代理
Cglib是一个字节码增强库,该代理对象的实现是在字节码的层面上。
实现步骤:
(1)实现MethodInterceptor接口,重写intercept方法(拦截器)
(2)写一个目标类的代理实现方法getInstance,设置Enhance工具类,设置父类回调函数,创建子类操作;
public class FactoryProxy implements MethodInterceptor {//维护一个目标对象private Object target;public FactoryProxy(Object target) {this.target = target;}//设置代理类public Object getInstance() {//设置工具类Enhancer enhancer = new Enhancer();//设置父类enhancer.setSuperclass(target.getClass());//回调函数enhancer.setCallback(this);//创建子类(代理类)return enhancer.create();}//拦截器@Overridepublic Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {//执行目标对象的方法Object returnValue = method.invoke(target, arg2);return returnValue;}
}
注意:
(1)目标对象的类不能为final
(2)目标方法如果为static、final,那么将不会执行拦截操作;
代理模式(JDK、CGLIB)相关推荐
- 设计模式之代理模式、动态代理模式、Cglib代理模式
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的 ...
- 代理模式(静态代理模式、动态代理模式、cgLib代理模式、拦截器)
目录 一.什么是代理? 二.代理的好处 三.实现代理的步骤 四.静态代理 五.动态代理
- 设计模式:代理模式是什么,Spring AOP还和它有关系?
接着学习设计模式系列,今天讲解的是代理模式. 定义 什么是代理模式? 代理模式,也叫委托模式,其定义是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.它包含了三个角色: Subject: ...
- 面试官 | 说一下什么是代理模式?
看了这篇文章,你会对静态代理模式,JDK 动态代理模式和 CGLIB 动态代理模式有个很清晰的认识. 01.简介 什么是代理模式 代理模式也称为委托模式,属于结构型模式之一.在某些情况下,一个对象不适 ...
- 设计模式之-代理模式
代理模式详解 特点: 1. 执行者. 被代理人 2. 对于被代理人来说, 这件事情是一定要做的, 但是我自己又不想做或者没有时间做, 找代理. 3. 需要获取到被代理的人个人资料. 4.关心过程 穷举 ...
- 《设计模式系列》- 代理模式
有情怀,有干货,微信搜索[三太子敖丙]关注这个有一点点东西的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文 ...
- SpringAOP之代理模式
SpringAOP之代理模式 SpringAOP之代理模式 一.代理模式 二.静态代理 三.JDK动态代理 四.CGLib动态代理 五.总结 SpringAOP之代理模式 SpringAOP指的是在s ...
- Spring/Boot/Cloud系列知识(2)——代理模式
代理模式是23种设计模式中的一种,属于一种结构模式.用一句大白话解释这个设计模式:当外部调用者调用A来完成一件事情/一个动作时,并不直接调用A本身,而是调用一个代理者,并再由代理者负责调用真实的执行者 ...
- Spring/Boot/Cloud系列知识(2)— — 代理模式
本文转自:https://blog.csdn.net/yinwenjie/article/details/77848285 代理模式是23种设计模式中的一种,属于一种结构模式.用一句大白话解释这个设计 ...
- 代理模式——静态代理,动态代理(JDK代理和CGLib代理)
概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...
最新文章
- Windows服务BAT命令-安装、卸载、启动、停止
- html网页缩小之后div框移动,css – DIV在浏览器中放大和缩小时移动
- Selenium应用代码(登录)
- 【渝粤题库】广东开放大学 劳动心理学 形成性考核
- 基于theano的keras安装
- Bootstrap按钮的外观
- Pentium 4处理器架构/微架构/流水线 (7) - NetBurst前端详解 - 分支预测
- 数据结构实验之图论七:驴友计划(最新版)
- php输出excel乱码,如何解决php导出excel乱码的问题
- XJOI 9864 金字塔
- 最新全志超清4K视频编解码芯片-V316处理器
- UESTC_树上战争 CDOJ 32
- html设计带图形的边框,css怎么设置图片的边框?
- 使用Hypothesis生成测试数据
- 如何快速启动wine安装的软件
- 2014年春季学期,每日计划总结,每日签到
- 软件工程课程学习小组项目——网上书店
- python3.4勾股定理代码_使用有序数组来解决勾股定理(Python)
- 菜鸟应用发布 全民跨入APP2.0时代
- 改变发型的软件叫什么?来试试这几个换发型软件