设计模式之--代理模式(动态代理)
JDK 提供的动态代理的两个相关的类:InvocationHandler 和 Proxy
一:Proxy
Proxy 提供了一个获取实例的静态方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
1 ClassLoader loader 目标对象类加载器(包含目标对象的属性、行为),
2 Class<?>[] interfaces 目标对象包含的所有接口
-------------------------1、2 这两个参数可以生成代理对象
3 InvocationHandler h 使用目标对象方法时,触发调用控制器中的invoke方法,做特殊业务处理
代理过程:根据目标对象的类加载器和所有接口生成代理对象,代理对象将目标对象的所有方法实现转移到InvocationHandler中的invoke中,
以便做业务逻辑中的特殊处理,AOP 就是这样实现的
二:InvocationHandler
InvocationHandler 接口只提供了一个接口方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
1 Object proxy 目标对象
2 Method method 动态代理对象的方法
3 Object[] args 动态代理对象的方法参数
在invoke中调用目标对象的指定方法,并进行差异化业务处理
三:接口
package dmode.proxy; /** * 类描述: 接口 * @version 1.0 CreateDate: 2015-2-13 */ public interface Subject { /** * 方法描述:上班打卡 */ public void punchCard(String name,String company); }
四:实现类
package dmode.proxy; /** * 类描述: 员工 * @version 1.0 CreateDate: 2015-2-13 */ public class Employer implements Subject{ @Override public void punchCard(String name,String company) { System.out.println(name + "上班打卡.......公司:" + company); } }
五:动态代理类
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 */ 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 来根据不同的方法做不同特色业务处理,利用反射
System.out.println("动态代理执行打卡..."); Object result = method.invoke(this.object, args); return result; } /** * 方法描述:获取代理对象 * @param subject * @return */ public static Subject 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 (Subject)object; } }
六:应用场景
package dmode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * 类描述: 入口 * @version 1.0 CreateDate: 2015-2-13 */ 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(); } }