




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java 静态代理和动态代理Java2010-10-16 17:22:21阅读129评论0字号:大中小订阅代理模式主要有两种:静态代理和动态代理1. 静态代理:比如要在输出“HelloWorld”前打印一个字符串“Welcome”A:先定义一个接口类packageproxy;public interfaceHelloWorld public void print();/ public void say();B: 定义一个该接口的实现类packageproxy;public class HelloWorldImpl implements HelloWorldpublic void print() System.out.println(HelloWorld); / public void say() / System.out.println(Say Hello!); / C:定义一个静态代理类packageproxy;public classStaticProxyimplementsHelloWorldpublicHelloWorld helloWorld ;publicStaticProxy(HelloWorld helloWorld)this.helloWorld = helloWorld;public voidprint()System.out.println(Welcome);/相当于回调helloWorld.print();/ public void say() / /相当于回调 / helloWorld.say(); / D: 一个测试类:packageproxy;public class TestStaticProxy public static void main(String args) HelloWorld helloWorld = new HelloWorldImpl(); StaticProxy staticProxy = new StaticProxy(helloWorld); staticProxy.print();/ staticProxy.say(); 可以看出静态代理类有一个很的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现,增加了代码的复杂度。2.动态代理 动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),而不需要像静态代理那样对接口的每一个方法进行中转。 动态代理类只能代理接口,代理类都需要实现InvocationHandler接口,覆盖invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的。C:定义动态代理类:(A、B如上)package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。/该invoke方法就是调用被代理接口的所有方法时需要调用的 public class DynamicProxy implements InvocationHandler private Object object; /绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的方法被调用时,执行invoke方法。/Proxy.newProxyInstance /构造一个实现给定接口的代理类的实例,所有方法都将调用给定处理器对象的invoke方法。 / 第一个参数表明类加载器,一般为null / 第二个参数表明代理类实现的接口 / 第三个参数表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法public Object bindRelation(Object object) this.object = object; return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this); /拦截关联的这个实现类的方法被调用时将被执行public Object invoke(Object proxy, Method method, Object args) throws Throwable System.out.println(Welcome);Object result = method.invoke(object, args);return result; 测试类:package proxy;public class TestDynamicProxy public static void main(String args)HelloWorld helloWorld = new HelloWorldImpl();DynamicProxy dp = new DynamicProxy();/在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。 /所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);helloWorld1.print();helloWorld1.say();/helloWorld2将不被拦截HelloWorld helloWorld2 = new HelloWorldImpl();helloWorld2.print();helloWorld2.say();在测试类里调用实现类的print和say方法,因为代理类里代理了HelloWorld的所有方法。所以就不需要像静态代理类那样一一实现了。还可以这样写:动态代理类:package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。/该invoke方法就是调用被代理接口的所有方法时需要调用的 public class DynamicProxy implements InvocationHandler private Object object; public DynamicProxy(Object object) this.object = object; /拦截关联的这个实现类的方法被调用时将被执行public Object invoke(Object proxy, Method method, Object args) throws Throwable System.out.println(Welcome);Object result = method.invoke(object, args);return result; 测试类:package proxy;public class TestDynamicProxy public static void main(String args)HelloWorld helloWorld = new HelloWorldImpl();DynamicProxy dp = new DynamicProxy(helloWorld); /在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。 /所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。HelloWorld helloWorld1 = (HelloWorld)Proxy.newProxyInstance(null, helloWorld.getClass().getInterfaces(),dp);helloWorld1.print();helloWorld1.say();/helloWorld2将不被拦截HelloWorld helloWorld2 = new HelloWorldImpl();helloWorld2.print();helloWorld2.say();/绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的方法被调用时,执行invoke方法。/Proxy.newProxyInstance /构造一个实现给定接口的代理类的实例,所有方法都将调用给定处理器对象的invoke方法。 / 第一个参数表明类加载器,一般为null / 第二个参数表明代理类实现的接口 / 第三个参数表明这些被拦截的方法执行时需要执行哪
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版安全设备安装与销售服务合同样本
- 2025版第四章国际海洋工程技术合作合同
- 二零二五年度购房定金协议范本:毛坯房
- 二零二五年度节能环保型围墙施工与能源管理系统合同
- 2025版电子元器件出口销售合同模板与供应链管理技巧
- 二零二五年度工业制造厂房租赁居间代理合同范本
- 2025版购物中心娱乐项目租赁合同
- 二零二五年度公共建筑节能改造委托造价咨询合同
- 2025至2030年中国浴室架行业市场发展现状及投资战略咨询报告
- 2025版电子商务平台服务合同标的交易风险控制指南
- 建筑中级职称《建筑工程管理》历年考试真题题库(含答案)
- 环境设计专业科技前沿课程教学大纲
- GA/T 2133.2-2024便携式微型计算机移动警务终端第2部分:安全监控组件技术规范
- 外科品管圈成果汇报课件-提高护理文书书写规范率
- 股东未(足额)缴纳出资的催缴函模板
- 交通警情分析总结报告
- 发电机同期并网试验方案及措施
- 安宁疗护中的舒适护理
- 2024年云南红河州开发区投资建设集团有限公司招聘笔试参考题库含答案解析
- 慢性结肠炎的护理查房
- 医学影像科年月三基三严考试附有答案
评论
0/150
提交评论