设计模式之代理模式
2015-08-14 19:32
218 查看
1 代理模式:就是一个类被另外一个类代替来执行某个方法,使得执行原来的方法的时候增加一些业务逻辑处理。
2 动态代理:通过反射技术,在运行过程进行代理的代理模式。
3 区别:静态代理:在程序编译时候,就已经形成代理类。
动态代理:利用反射技术实现,在程序运行时候才能得到代理类。
4 动态代理分为需要实现接口和不需要实现接口两种:
被代理类实现接口的时候可以用 反射包下的InvocationHandler和Proxy实现生成代理;
被代理类没有实现接口,此时之前的方式就不可以用了,需要cglib生成二进制码,来获取代理类。
5 基于反射情况的动态代理模式:
接口:
实现类:
代理类:
测试类:
2 动态代理:通过反射技术,在运行过程进行代理的代理模式。
3 区别:静态代理:在程序编译时候,就已经形成代理类。
动态代理:利用反射技术实现,在程序运行时候才能得到代理类。
4 动态代理分为需要实现接口和不需要实现接口两种:
被代理类实现接口的时候可以用 反射包下的InvocationHandler和Proxy实现生成代理;
被代理类没有实现接口,此时之前的方式就不可以用了,需要cglib生成二进制码,来获取代理类。
5 基于反射情况的动态代理模式:
接口:
package com.in; public interface Hello { public void say(); }
实现类:
package com.in; public class HelloImpl implements Hello{ @Override public void say() { System.out.println("in hello"); } }
代理类:
package com.in; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class HelloProxy implements InvocationHandler{ private Object obj; public HelloProxy(Object obj){ this.obj=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; before(); method.invoke(obj, args); after(); return result; } public void before(){ System.out.println("in before"); } public void after(){ System.out.println("in after"); } }说明:声明一个被代理类型的属性,通过构造方法实例化。method.invoke(被代理对象,参数)。
测试类:
package com.in; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Hello hello=new HelloImpl(); InvocationHandler proxy=new HelloProxy(hello); Hello h=(Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), proxy); h.say(); } }说明:Proxy生成被代理对象。
相关文章推荐
- datatable
- HDOJ 5373 The shortest problem 【数论】
- android 电容屏(二):驱动调试之基本概念篇
- HDOJ 5373 The shortest problem 【数论】
- ListView中requestLayout执行流程解析
- Selendroid inspector
- 如何在Android智能手机上捕获数据包?
- ACM最大公共子序列&&回文串
- 懒人科技,是福是祸?
- Hadoop实战之hadoop2.5.2完全分布式安装
- OC - NSValueAndNSNumber
- android 电容屏(一):电容屏基本原理篇
- 11.PHP 教程_PHP Switch 语句
- Dolls---hdu4160(最大匹配)
- vs2010常见的错误
- php最简单的注入与最简单的避免方式
- 算法题:A除以B
- Derivation of User Browsing Model
- JS的覆盖特性来解决文件冲突问题,css的加载问题
- swift--闭包