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 方法的拦截,做特殊业务处理
三:接口
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(); } }