一、代理
1、代理模式:为其他对象提供一种代理以控制对这个对象的访问,可在执行业务处理的前后进行相关的预处理和后置处理,还可以用于实现延迟加载功能等
2、分类:
1)静态代理:在编译阶段为被需要代理的类,创建一个代理类。当需要被代理的类很多时,需要创建多个代理类。
2)动态代理:运行阶段进行代理,通用性强,常见:JDK动态代理和CGLIB动态代理
二、JDK动态代理实现
public interface ISubject { String sayHellow(String name); }
class SubjectImpl implements ISubject { @Override public String sayHellow(String name) { System.out.println(name + "你好!"); return name; } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class TestInvocationHandler implements InvocationHandler { private Object target; public TestInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("此处是前置处理"); Object result = method.invoke(target, args); System.out.println("此处是后置处理"); return result; } public Object getProxy() { return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this); } }
public class Test { public static void main(String [] args) { ISubject subject = new SubjectImpl(); TestInvocationHandler invocationHandler = new TestInvocationHandler(subject); ISubject proxy = (ISubject) invocationHandler.getProxy(); proxy.sayHellow("猴子哥哥"); } }三、实现原理
动态创建代理类,并通过指定类加载器加载,然后在创建代理对象时将InvokerHandler对象作为构造参数传入。当调用代理对象时,会调用InvokerHandler.invoke()方法,并最终调用真正业务对象的相应方法。
具体实现细节,请参照jdk源码,若需了解JDK动态代理与CGLIB动态代理的区别,请参考:http://blog.youkuaiyun.com/qq_21033663/article/details/52295580