Java动态代理详解
Java动态代理只对实现了接口方法的实现类有效,接口和实现类代码如下:
package com.coshaho.reflect; public interface Subject { String doSomething(); }
package com.coshaho.reflect; public class RealSubject implements Subject { @Override public String doSomething() { System.out.println("Execute Service."); return "Done"; } }
Java动态代理使用步骤:
1、 创建动态代理方法处理器(实现InvocationHandler接口);
package com.coshaho.reflect; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 动态代理方法处理器 * @author coshaho * */ public class ProxyHandler implements InvocationHandler { /** * 需要被代理的类 */ private Object obj; ProxyHandler(Object obj) { this.obj = obj; } /** * method: 代理类需要被调用的方法 * args: 动态代理类方法被调用时传入的参数 * proxy: 动态代理类自身,一般无用 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Log: Service Begin."); Object result = method.invoke(obj, args); System.out.println("Log: Service Done."); return result; } }
注:这里需要注意的是,动态代理方法处理器实例一般需要包含被代理类(obj)。invoke函数在动态代理类被调用接口方法时被调用,参数为动态代理类自身,被代理类需要被调用的方法,动态代理类调用接口方法时传入的参数。
2、 创建动态代理类并使用。
package com.coshaho.reflect; import java.lang.reflect.Proxy; public class DynamicProxy { public static void main(String[] args) { Subject subject = new RealSubject(); /** * Proxy.newProxyInstance * 参数1: 动态代理类需要的ClassLoader * 参数2: 动态代理类实现的接口列表 * 参数3: 动态代理类处理器 */ Subject proxySubject = (Subject)Proxy.newProxyInstance( subject.getClass().getClassLoader(), new Class[]{Subject.class}, new ProxyHandler(subject)); proxySubject.doSomething(); } }
源码分析可以参考:http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html