Java_静态代理和动态代理.docx_第1页
Java_静态代理和动态代理.docx_第2页
Java_静态代理和动态代理.docx_第3页
Java_静态代理和动态代理.docx_第4页
Java_静态代理和动态代理.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论