两种代理模式:java
jdk的动态代理是基于接口的动态代理,要求目标对象必须实现至少一个接口,核心API是java.lang.reflect.Proxy
类的newProxyInstance
方法。数组
Object proxy = Proxy.newProxyInstance( ClassLoader loader, Class[] interfaces, InvocationHandler handler );
返回值:接口的实现类对象ide
参数:代理
loader:类加载器对象code
interfaces:代理对象要实现的接口字节码对象数组,一般写成目标对象.getClass().getInterfaces()
对象
handler:代理类的方法里,要执行的操做接口
一般是加强目标对象的方法或控制目标对象的方法get
是InvocationHandler接口的实现类,一般写成匿名内部类形式io
new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //proxy:代理对象的引用,一般不用 //method:调用的方法对象 //args:调用的方法的参数 //result:调用代理对象时的返回值 return result; } }
cglib的动态代理是基于子类的动态代理,不须要目标对象实现接口,要求被代理类不能由final修饰.核心API是cglib.proxy.Enhancer
类的create
方法class
Enhancer.create(目标对象.getClass(), new MethodInterceptor() { /** * @param proxy:代理对象引用 * @param method:目标对象方法(经过它能够访问目标对象) * @param args:传递给目标对象的参数 * @MethodProxy methodProxy:代理对象的方法 * @return 返回值 * @throws Throwable */ public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //功能代码 return result; } });
返回值:目标类的子类对象
参数: