JDK动态代理代理与Cglib代理区别
在Java中,许多框架的底层都是基于动态代理来实现的,比如Aop,mybaits动态生成数据库操作类。在Java中有两种动态代理的方法,一种是JDK原生的动态代理,一种是基于Cglib的代理方式
什么是代理模式
为其他对象提供一种代理以控制对这个对象的访问
什么是动态代理
与静态代理在程序运行前就已经存在的方式不同,动态代理指的是代理类是在运行时才被创建出来的。相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。
动态代理的实现方式
1.JDK动态代理
1.定义接口
/*
* @Author Avalon
* @Email szhujiabin@163.com
* @Version V1.0
* @Created Date:2017/8/6
*/
public interface IService {
String doService(String s);
}
2.定义实现类
/*
* @Author Avalon
* @Email szhujiabin@163.com
* @Version V1.0
* @Created Date:2017/8/6
*/
public class ServiceImpl implements IService {
@Override
public String doService(String s) {
return String.format("hello:%s", s);
}
}
3.InvocationHandler类
/*
*
* @Author Avalon
* @Email szhujiabin@163.com
* @Version V1.0
* @Created Date:2017/8/6
*/
public class MyInvocationHandler<T> implements InvocationHandler {
private T target;
public MyInvocationHandler(T target) {
super();
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 T getProxy() {
return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);
}
}
4.测试类
/*
*
* @Author Avalon
* @Email szhujiabin@163.com
* @Version V1.0
* @Created Date:2017/8/6
*/
public class MyInvocationHandler<T> implements InvocationHandler {
private T target;
public MyInvocationHandler(T target) {
super();
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 T getProxy() {
return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this);
}
}
运行结果
方法调用前
hello:Avalon
方法调用后
可以看到在方法动用前后都打印出了相应的日志,说明方法已经成功被代理了。那具体JDK是怎么实现的呢,让我们来看看JDK生成的代理类$Proxy0
public final class $Proxy0 extends Proxy implements IService {
private static Method m1;
private static