欢迎来到天天文库
浏览记录
ID:37710506
大小:20.28 KB
页数:5页
时间:2019-05-29
《Java_静态代理和动态代理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java静态代理和动态代理Java 2010-10-1617:22:21 阅读129 评论0 字号:大中小 订阅代理模式主要有两种:静态代理和动态代理 1.静态代理: 比如要在输出“HelloWorld”前打印一个字符串“Welcome”A:先定义一个接口类 package proxy;publicinterface HelloWorld{ publicvoidprint();// publicvoidsay();}B:定义一个该接口的实现类 package proxy; publicclassHelloWorldI
2、mplimplementsHelloWorld{ publicvoidprint(){ System.out.println("HelloWorld"); } // publicvoidsay(){ // System.out.println("SayHello!"); // } } C:定义一个静态代理类 package proxy; publicclass StaticProxy implements HelloWorld{ public HelloWorldh
3、elloWorld; public StaticProxy(HelloWorldhelloWorld){ this.helloWorld=helloWorld; } publicvoid print(){ System.out.println("Welcome"); //相当于回调 helloWorld.print(); } // publicvoidsay(){ //
4、 //相当于回调 // helloWorld.say(); // } } D:一个测试类: package proxy; publicclassTestStaticProxy{ publicstaticvoidmain(String[]args){ HelloWorldhelloWorld=newHelloWorldImpl(); StaticProxystaticProxy=newStaticProxy(helloWorld);
5、 staticProxy.print(); // staticProxy.say(); } }可以看出静态代理类有一个很的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现,增加了代码的复杂度。 2.动态代理 动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),而不需要像静态代理那样对接口的每一个方法进行中转。 动态代理类只能代理接口,代理类都需要实现InvocationHandler
6、接口,覆盖invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的。C:定义动态代理类:(A、B如上)packageproxy; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。//该
7、invoke方法就是调用被代理接口的所有方法时需要调用的 publicclassDynamicProxyimplementsInvocationHandler{ privateObjectobject; //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的方法被调用时,执行invoke方法。 //Proxy.newProxyInstance//构造一个实现给定接口的代理类的实例,所有方法都将调用给定处理器对象的invoke方法。//第一个参数表明类加载器,一般为null//
8、第二个参数表明代理类实现的接口//第三个参数表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法 publicObjectbindRelation(Objectobject){ this.object=ob
此文档下载收益归作者所有