动态代理是在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能增强的一种技术。
在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。
可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。
代理类在程序运行期间,创建的代理对象称之为动态代理对象。
这种情况下,创建的代理对象,并不是事先在Java代码中定义好的。而是在运行期间,根据我们在动态代理对象中的“指示”,动态生成的。也就是说,你想获取哪个对象的代理,动态代理就会为你动态的生成这个对象的代理对象。
动态代理可以对被代理对象的方法进行功能增强。
有了动态代理的技术,那么就可以在不修改方法源码的情况下,增强被代理对象的方法的功能,在方法执行前后做任何你想做的事情。
一句话:动态代理其实就是JDK运行期间,动态创建class字节码文件并加载到JVM。代理类对象是在运行时,由JVM根据反射机制动态生成的。动态代理不需要定义代理类的.java源文件。
实现方式 JDK动态代理:使用java反射包中的类和接口实现动态代理的功能。 反射包:java.lang.reflect 使用的类:
- InvocationHandler
- Method
- Proxy
cglib时第三方的工具库,用于创建代理对象。 cglib的原理是继承,cglib通过继承目标类,创建其子类,在子类中重写父类中同名的方法,实现功能的修改。因为cglib需要继承目标类,所以要求目标类不能是final的,方法也不能是final的。 cglib对于目标类的要求比较宽松,只要能继承就可以。 cglib在很多框架中使用,如mybatis,spring框架。