设计模式之--代理模式(动态代理)
2015-02-15 10:35
393 查看
JDK 提供的动态代理的两个相关的类:InvocationHandler 和 Proxy
一:InvocationHandler
InvocationHandler 接口只提供了一个接口方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
1 Object proxy 被代理的对象 2 Method method 被代理对象的实现方法 3 Object[] args 被代理对象的方法参数
这三个条件决定类在调用被代理类的具体什么方法时,生成代理对象
二:Proxy
Proxy 提供了一个获取实例的静态方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
1 ClassLoader loader 被代理对象的类加载器 2 Class<?>[] interfaces 被代理对象实现的所有接口 3 InvocationHandler h 被代理对象的动态代理类
Proxy 会默认实现被代理类的所有接口方法,方法默认都返回null ,什么业务逻辑都没做,通过被代理对象的ClassLoader 获取实际处理逻辑,
通过动态代理类InvocationHandler 做业务逻辑中的特殊处理,AOP 就是这样实现的
其他:
动态代理在每一次调用代理对象的方法的时候,都会经过InvocationHandler 实现的类的invoke 方法的拦截,做特殊业务处理
三:接口
四:实现类
五:动态代理类
六:应用场景
一:InvocationHandler
InvocationHandler 接口只提供了一个接口方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
1 Object proxy 被代理的对象 2 Method method 被代理对象的实现方法 3 Object[] args 被代理对象的方法参数
这三个条件决定类在调用被代理类的具体什么方法时,生成代理对象
二:Proxy
Proxy 提供了一个获取实例的静态方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
1 ClassLoader loader 被代理对象的类加载器 2 Class<?>[] interfaces 被代理对象实现的所有接口 3 InvocationHandler h 被代理对象的动态代理类
Proxy 会默认实现被代理类的所有接口方法,方法默认都返回null ,什么业务逻辑都没做,通过被代理对象的ClassLoader 获取实际处理逻辑,
通过动态代理类InvocationHandler 做业务逻辑中的特殊处理,AOP 就是这样实现的
其他:
动态代理在每一次调用代理对象的方法的时候,都会经过InvocationHandler 实现的类的invoke 方法的拦截,做特殊业务处理
三:接口
package dmode.proxy; /** * 类描述: 接口 * @version 1.0 CreateDate: 2015-2-13 * * @updateDate * @updatePerson * @declare */ public interface Subject { /** * 方法描述:打卡 */ public void punchCard(String name,String company); /** * 方法描述:上班 */ public void beOnDuty(); /** * 方法描述:下班 */ public void offDuty(); }
四:实现类
package dmode.proxy; /** * 类描述: 员工 * @version 1.0 CreateDate: 2015-2-13 * * @updateDate * @updatePerson * @declare */ public class Employer implements Subject{ /** *@see dmode.proxy.Subject#punchCard() */ @Override public void punchCard(String name,String company) { System.out.println(name + "上班打卡.......公司:" + company); } /** *@see dmode.proxy.Subject#beOnDuty() */ @Override public void beOnDuty() { System.out.println("开始工作......."); } /** *@see dmode.proxy.Subject#offDuty() */ @Override public void offDuty() { System.out.println("下班打卡......."); } }
五:动态代理类
package dmode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 类描述: 动态代理类 * @version 1.0 CreateDate: 2015-2-13 * * @updateDate * @updatePerson * @declare */ public class DynamicProxy implements InvocationHandler{ //被代理实例 Object object = null; public DynamicProxy(Object _obj){ this.object = _obj; } /** * JDK 动态代理方法,对被代理类的方法进行代理 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //此处可以通过Method 来根据不同的方法做不同特色业务处理,利用反射 Object result = method.invoke(this.object, args); return result; } /** * 方法描述:获取代理对象 * @param subject * @return */ public static <T extends Subject> T getProxy(Subject subject){ ClassLoader classLoader = subject.getClass().getClassLoader(); Class<?>[] interfaceArry = subject.getClass().getInterfaces(); InvocationHandler invoHandler = new DynamicProxy(subject); Object object = Proxy.newProxyInstance(classLoader, interfaceArry,invoHandler); return (T)object; } }
六:应用场景
package dmode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * 类描述: 入口 * @version 1.0 CreateDate: 2015-2-13 * * @updateDate * @updatePerson * @declare */ public class Acce { public static void main(String[] args) { Subject emp = new Employer(); Subject dyProxy = DynamicProxy.getProxy(emp); dyProxy.punchCard("zzd","fencer"); dyProxy.beOnDuty(); dyProxy.offDuty(); } }
相关文章推荐
- [转]转个经典的帖子:说故事学设计模式之-Java动态代理模式
- 设计模式之动态代理
- java设计模式之动态代理
- java动态代理设计模式简单示例
- [ 设计模式 ] 动态代理!
- java 设计模式之四-代理模式 java静态代理和动态代理
- 设计模式:用Java动态代理实现AOP
- 设计模式-动态代理
- Java设计模式-动态代理研究分享
- java设计模式之动态代理
- java设计模式_代理模式_动态代理(带例子)
- 代理模式设计(2)-----动态代理
- -java 动态代理设计模式
- Java设计模式Proxy之动态代理
- 设计模式之观察者与动态代理的结合应用
- 设计模式之动态代理
- 设计模式之 动态代理模式
- java设计模式--代理及其动态代理--05
- 用java调用编译器编译java文件-马士兵设计模式教程-动态代理 .
- 使用自动生成java文件和自动编译的动态代理模式-马士兵设计模式教程