什么是动态代理
动态代理即是在程序运行过程中动态地创建代理对象,动态代理是基于反射的,动态代理分为jdk动态代理以及cglib东岱 代理
什么是反射
反射是指在运行过程中,我们通过类的名称或者实例对象就可以拿到对应的class对象,通过这个对象可以获得这个类的所有方法以及属性,甚至可以修改这些属性
而class对象是通过类加载得来的
动态代理可以做什么
我们可以通过一个代理类来调用一个目标类,可以让调用者是实现者进行解耦;不仅如此,在通过代理调用的过程中我们还可以在代理中增强代码,即在调用目标功能前后加上我们自己需要的功能
JDK动态代理
JDK动态代理是基于接口的,要求被代理类一定有继承接口
实现过程如下:
首先创建一个切面类去继承InvocationHanlder接口,然后重写里面的invoke方法,然后书写一个获取代理类的方法
将一个目标实现类的实例传给切面类里生成代理对象方法,这个方法会根据传进来的实例拿到对应的类加载器以及实现接口,再以上两个参数的基础上加上一个切面类实例,通过这三个参数生成一个代理类
将这个代理类强转成目标接口实例,然后这个实例去调用对应的目标方法,这个调用将会被代理类所拦截转而去执行invoke方法,invoke方法通过反射的方式再去调用目标类的方法
cglib动态代理
cglib是一个第三方工具库,使用的过程需要引入对应的jar包
它实现动态代理的原理是继承,cglib通过生成一个目标类的子类,然后在子类中重写父类同名的方法,以实现功能的调用甚至是修改
由于cglib是基于继承重写方法的,因此要求目标类不能是final且目标方法也不能是final