静态代理、JDK 动态代理和 Cglib 动态代理区别有哪些?
问题解答发布日期:2021-03-09 14:06:44          

1615269983343476.png


代理模式是Java中常见的设计模式。代理类通过调用代理类的相关方法来增强相关方法。添加一些非业务代码,比如事务处理,日志处理等等。Spring的AOP是基于代理模式实现的。


在遇到代理模式之前使用代理非常麻烦。为什么需要添加代理类而不是直接调用一个类的方法?事实上,当您只有一个类来实现一些添加的函数时,直接在这个类中添加方法是非常简单的。当你有几十个或者几百个类来添加同样的函数时,一次添加一个类是非常麻烦的。使用代理,一种是增加函数的便利性,直接写入代理类;二是降低了代码耦合度,更便于调整和维护。调整时只需要调整代理类,其他类的代码不需要移动。


三个特点和区别:

1. 静态代理,将被代理对象写入一个类,只能处理一个类,执行效率高,代码耦合性好,可重用性差。

2. JDK动态代理,即代理类要实现InvocationHandler接口,接口中有methodmethod.invoke(object,parameter),使用反射执行被代理对象的方法;Java动态代理通过Proxy.newProxyInstance()方法动态获取代理对象,该方法有三个参数:(类加载器、接口、InvocationHandler接口的子类实例);一个参数是接口,也就是说,Java动态代理只能代理已经实现接口的类,而如果被代理的类没有实现任何接口,则不能实现JDK动态代理。

3. Cglib动态代理通过接口实现,不同于JDK动态代理,通过继承实现,覆盖了被代理类的方法,通过生成子类字节码增强了被代理方法的功能;因为Cglib动态代理继承了被代理的类,所以final修改的类或方法无法实现Cglib动态代理。


文章部分内容源于网络,联系侵删*


在线
咨询

售后客服

永久免费售后服务

太阳大客户经理

15305445551
微信客服
免费
套餐
意见
反馈
置顶