代理的作用:实现了核心类(被代理类)和非核心类(代理类)的分离,让核心类只做核心业务,非核心类只做非核心业务。
动态代理:
最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),全部封装在了实例化代理对象时的Method参数中,这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每个方法进行中转。
只能代理接口,代理类都需要实现InvocationHandler类,重写invoke方法。该方法在代理对象调用被代理接口的方法时调用。
如下所示,创建一个动态代理类DynamicProxy
public class DynamicProxy implements InvocationHandler {
private Object obj;
public DynamicProxy(Object obj)
{
this.obj = obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
method.invoke(obj, args);
return null;
}
}
获取代理对象的方法,如下所示:
Object = (Object )Proxy.newProxyInstance(被代理类名 ().getClass().getClassLoader(), 被代理类名.class.getInterfaces(), 代理对象);
通过代理对象调用被代理接口的方法。
静态代理:
代理类和被代理类实现同一个接口, 在代理类中实例化被代理类对象(利用向上转型),利用该对象可以调用被代理类的核心方法。从而代理类对象可以调用自己的方法和被代理类的方法。
缺点是当接口的方法增加或修改时,需要在代理类和非代理类中相应增加、修改该方法,增加了代码的复杂性,强壮性低,不建议。
推荐阅读文章:http://www.cnblogs.com/best/p/5679656.html SpringMVC代理实现AOP+IOC