Java代理模式主要有三种类型:静态代理、动态代理和CGLIB代理。
静态代理: 静态代理是在编译时生成代理类,代理类和被代理类实现相同的接口,并持有被代理类的实例。在调用被代理类的方法时,代理类将方法调用转发给被代理类的实例。静态代理的优点是简单易懂,缺点是需要为每个需要代理的类都编写一个代理类,导致代码量增加。
动态代理: 动态代理是在运行时生成代理类,代理类同样实现与被代理类相同的接口,并持有被代理类的实例。动态代理的优点是只需要编写一个代理类,就可以代理多个类,代码量减少。动态代理的核心是InvocationHandler接口,它负责处理代理类的方法调用。Java提供了java.lang.reflect.Proxy类来创建动态代理对象。
CGLIB代理: CGLIB代理是基于继承被代理类的方式生成代理类。CGLIB代理的优点是可以代理没有实现接口的类,缺点是代理类会继承被代理类的所有方法,可能导致代理类变得庞大。CGLIB通过继承被代理类的方式生成子类,并在子类中添加代理逻辑。
总结: 静态代理和动态代理都是基于接口实现的,而CGLIB代理是基于继承实现的。静态代理适用于简单的场景,动态代理适用于需要代理多个类的场景,而CGLIB代理适用于需要代理没有实现接口的类的场景。