




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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广东云浮市罗定市市场监督管理局招用青年见习人员2人模拟试卷附答案详解(完整版)
- 2025安徽安庆望江县融媒体中心急需紧缺专业技术人员招聘2人考前自测高频考点模拟试题及答案详解(新)
- 2025年上半年全省事业单位公开招聘工作人员(含教师)笔试南充考区考前自测高频考点模拟试题附答案详解(突破训练)
- 2025湖南省儿童医院高层次人才公开招聘16人模拟试卷带答案详解
- 2025年度郑州工程技术学院招聘高层次人才81名考前自测高频考点模拟试题附答案详解(突破训练)
- 2025昆明市禄劝县人民法院聘用制书记员招录(2人)考前自测高频考点模拟试题及答案详解(各地真题)
- 2025湖南株洲市行政审批服务局公开招聘中级雇员2人模拟试卷及答案详解(夺冠)
- 2025年度郑州警察学院招聘人才(第二批)15名考前自测高频考点模拟试题及一套答案详解
- 2025广西柳州市考试录用公务员(人民警察)体能测评模拟试卷及答案详解(必刷)
- 2025广东茂名市化州市播扬镇敬老院招聘10人考前自测高频考点模拟试题完整参考答案详解
- 慢阻肺临床路径试题及答案
- 800个产粮大县名单
- 2025年新兼职安全员安全培训试题及答案
- 集体荣誉-主题班会课件
- 养老现状课件
- 【某酚醛污水处理厂的经济评估计算过程案例2100字】
- 当代科技伦理与自然辩证法课程的融合与教学创新探索
- 公司年度财务预算
- 2025年高考语文考前关注:作文审题立意技巧
- 氯气的性质课件高一上学期化学人教版
- 水利工程监理部主要工作制度(依据2014版监理规范编写)
评论
0/150
提交评论