原理
利用反射机制在运行时创建代理类
反射:是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
代理模式
通俗指为一个目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。使用代理对象,是为了在不修改目标对象的基础上,增强目标对象的业务逻辑。
代理可分为静态代理和动态代理
静态代理
- 静态:指的是代理类是手动编码创建的
- 实现:创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。
动态代理
- 动态:指的是代理类是在程序运行时创建的,而不是在程序运行前手动编码来定义代理类的
- 常用的两种方式:JDK动态代理、CGLIB动态代理,其余还有三种可方式作为了解 除了JDK、CGLIB,还有3种类代理方式?面试又卡住
- 共同点:两种方式都是基于创建字节码的方式来创建代理类
- 不同点:
https://www.jianshu.com/p/992dfcecff34
1、JDK动态代理只能代理实现了接口的类(因为JDK动态代理最终生成的代理类需要继承Proxy类,通过Proxy类的成员InvocationHandler来调用增强的方法,由于Java不支持多继承,因此无法对没有实现接口的类通过继承的方式进行代理)
https://blog.csdn.net/jiankunking/article/details/52143504
2、CGLIB动态代理可以代理任何非final类的非final方法,通过生成目标类的子类,即通过继承的方式来实现对于目标方法的增强
https://blog.csdn.net/yhl_jxy/article/details/80633194
网友评论