很多框架和工具都是利用代理技术实现的。典型的如spring 的AOP、easymock、单元覆盖率检测工具等。静态代理比较好理解,就是自己写代理类来完成附加的功能,设计模式中专门有个代理模式讲这个。动态代理是指代理实现对象并不是在编译期间生成好的,而是在运行过程中产生的。这样的好处是当被代理的接口方法(注:jdk动态代理只能对接口进行代理)发生变化时,不需要改动代理实现类的代码。以下为示例代码:
假设有个接口:
public interface IDoSomething { public void doA(); //public void doB(); }
public class DoSomethingImpl implements IDoSomething{ @Override public void doA() { System.out.println("I'm working..."); } }
public class StaticProxyDoSomething implements IDoSomething{ private IDoSomething target; public StaticProxyDoSomething(IDoSomething target){ this.target=target; } public void doA(){ System.out.println("代理准备"); target.doA(); System.out.println("代理完成"); } // public void doB(){ // // } }可以看出,当接口方法发生变化,代理类里的方法也要跟着修改
动态代理类写成这样就可以了:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ProxyDoSomething implements InvocationHandler{ private Object target; public ProxyDoSomething(Object target){ this.target=target; } public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ Object result; System.out.println("准备工作..."); result=method.invoke(target,args); System.out.println("代理完成..."); return result; } }
最后是一个简单的测试类:
import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args){ DoSomethingImpl dsi=new DoSomethingImpl(); IDoSomething proxy=(IDoSomething)Proxy.newProxyInstance(dsi.getClass().getClassLoader(), dsi.getClass().getInterfaces(),new ProxyDoSomething(dsi)); proxy.doA(); } }