什么是代理模式?

代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作。在代理类调用目标类的前后可以添加一些预处理和后处理操作来完成一些不属于目标类的功能。
为什么要使用代理模式?
通过代理模式可以实现对目标类调用的控制、在目标类调用前/后进行一些不属于目标类的操作,如:数据验证、预处理、后处理、异常处理等
什么是静态代理什么是动态代理?
jdk代理和cglib代理区别在哪里?
不同点:jdk动态代理的目标类必须实现的有接口,因为在调用Proxy.newProxyInstance()的时候需要传入目标类的接口类。而cglib不做此限制。
下面看代码分析:
定义一个Person接口
package com.zpj.designMode.proxy;
//定义一个Person接口
public interface Person {
public void doWork();
}
添加一个实现类:MrLi
package com.zpj.designMode.proxy;
//添加一个实现类
public class MrLi implements Person {
@Override
public void doWork() {
System.out.println("-----doWork");
}
}
静态代理:
添加一个静态代理类Proxy
package com.zpj.designMode.proxy;
//静态代理,代理必须和目标类实现共同的接口
public class Proxy implements Person {
private Person person;// 被代理人
//这里的目标类型决定了该代理类只能代理实现了Person接口的实例,而不能接收其他类型参数,这也就是静态代理的局限性
public Proxy(Person person) {
this.person = person;
}
@Override
public void doWork() {
System.out.println("doSomething-----start");
person.doWork();
System.out.println("doSomething-----end");
}
}
静态代理测试程序:
package com.zpj.designMode.proxy;
public class Run {
public static void main(String[] args) {
MrLi li = new MrLi();
Proxy proxy = new Proxy(li);
//调用处直接调用代理进行目标方法的操作。
proxy.doWork();
}
}
JDK动态代理:
添加一个代理JDKProxy,该代理实现InvocationHandler接口且覆写invoke方法。
package com.zpj.designMode.proxy.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/***
@author Perkins Zhu
@date 2017年3月13日 上午8:41:10
*/
public class JDKProxy implements InvocationHandler {
private Object person;// 被代理人
//这里的目标类型为Object,则可以接受任意一种参数作为被代理类,实现了动态代理。但是要注意下面的newProxyInstance()中的参数
public Object getInstance(Object person) {
this.person = person;
//与cglib的区别在于这里构建代理对象的时候需要传入被代理对象的接口对象,第二个参数。而cglib不需要被代理对象实现任何接口即可
return Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("doSomething---------start");
method.invoke(person, args);
System.out.println("doSomething---------end");
return null;
}
}
JDK动态代理测试程序
package com.zpj.designMode.proxy.jdk;
import com.zpj.designMode.proxy.MrLi;
import com.zpj.designMode.proxy.Person;
/***
* @author Perkins Zhu
* @date 2017年3月13日 上午8:51:31
*/
public class Run {
public static void main(String[] args) {
Person person = (Person) new JDKProxy().getInstance(new MrLi());
//注意这里的person不是目标类person,而是代理类person:debug的时候显示null,有'$'标识符
person.doWork();
}
}
Cglib动态代理:
添加一个CglibProxy代理,同时实现MethodInterceptor接口。
package com.zpj.designMode.proxy.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/***
* @author Perkins Zhu
* @date 2017年3月13日 上午9:02:54
*/
public class CglibProxy implements MethodInterceptor {
private Object targetObject;
// 这里的目标类型为Object,则可以接受任意一种参数作为被代理类,实现了动态代理
public Object getInstance(Object target) {
this.targetObject = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
//注意该处代理的创建过程
Object proxyObj = enhancer.create();
return proxyObj;// 返回代理对象
}
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object obj = null;
System.out.println("doSomething---------start");
obj = method.invoke(targetObject, args);
System.out.println("doSomething---------end");
return obj;
}
}
Cglib动态代理测试程序
package com.zpj.designMode.proxy.cglib;
import com.zpj.designMode.proxy.MrLi;
import com.zpj.designMode.proxy.Person;
/***
@author Perkins Zhu
@date 2017年3月13日 上午9:07:38
*/
public class Run {
public static void main(String[] args) {
Person person = (Person)new CglibProxy().getInstance(new MrLi());
person.doWork();
}
}
仔细对比Proxy、CglibProxy和JDKProxy区分静态代理、JDK动态代理和Cglib动态代理的异同点!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# cglib和jdk
# jdk动态代理和cglib
# jdk代理和cglib代理
# java动态代理(jdk与cglib)详细解析
# 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)
# Java反射(JDK)与动态代理(CGLIB)详解
# Java JDK与cglib动态代理有什么区别
# java 中动态代理(JDK
# cglib)实例代码
# java中jdk代理和cglib代理使用步骤详解
# 上午
# 实现了
# 可以实现
# 则可
# 不属于
# 后处理
# 不需要
# 这也
# 要注意
# 第二个
# 不做
# 但对
# 来完成
# 要使
# 大家多多
# 不直接
# 直接调用
# 决定了
# 异同点
# private
相关文章:
岳西云建站教程与模板下载_一站式快速建站系统操作指南
北京网站制作的公司有哪些,北京白云观官方网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何制作网站标识牌,动态网站如何制作(教程)?
建站之星安装后界面空白如何解决?
如何在阿里云虚拟服务器快速搭建网站?
招商网站制作流程,网站招商广告语?
C#怎么使用委托和事件 C# delegate与event编程方法
如何在服务器上配置二级域名建站?
如何通过可视化优化提升建站效果?
C++中引用和指针有什么区别?(代码说明)
如何在阿里云购买域名并搭建网站?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
实现虚拟支付需哪些建站技术支撑?
如何高效生成建站之星成品网站源码?
如何通过虚拟机搭建网站?详细步骤解析
家庭服务器如何搭建个人网站?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
常州企业建站如何选择最佳模板?
如何设计高效校园网站?
如何选择可靠的免备案建站服务器?
孙琪峥织梦建站教程如何优化数据库安全?
简单实现Android验证码
如何选择高效响应式自助建站源码系统?
如何确保FTP站点访问权限与数据传输安全?
建站之星代理费用多少?最新价格详情介绍
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
建站之星客服服务时间及联系方式如何?
,在苏州找工作,上哪个网站比较好?
如何快速搭建支持数据库操作的智能建站平台?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何确认建站备案号应放置的具体位置?
制作网站的模板软件,网站怎么建设?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
简单实现Android文件上传
如何通过PHP快速构建高效问答网站功能?
如何生成腾讯云建站专用兑换码?
如何撰写建站申请书?关键要点有哪些?
如何基于PHP生成高效IDC网络公司建站源码?
活动邀请函制作网站有哪些,活动邀请函文案?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何通过宝塔面板实现本地网站访问?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
制作门户网站的参考文献在哪,小说网站怎么建立?
浅析上传头像示例及其注意事项
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
建站之星免费模板:自助建站系统与智能响应式一键生成
建站之星安装失败:服务器环境不兼容?
如何快速搭建自助建站会员专属系统?
*请认真填写需求信息,我们会在24小时内与您取得联系。