java代理静态代理和动态代理
简介 | 优点 | 缺点 | |
---|---|---|---|
静态代理 | 在不修改目标对象的基础上,通过扩展类对目标对象进行增强和扩展。 | 静态代理对客户(测试类)隐藏了被代理类接口(目标类接口)的具体实现类,在一定程度上实现了解耦合,同时提高了安全性。 | 静态代理类需要实现目标类(被代理类)的接口,并实现其方法,造成了代码的大量冗余。静态代理只能对某个固定接口的实现类进行代理服务,其灵活性不强。故一般大项目不会选择静态代理。 |
jdk动态代理 | 使用java反射包中的类和接口实现动态代理的功能 | 动态代理实现了只需要将被代理对象作为参数传入代理类就可以获取代理类对象,从而实现类代理,具有较强的灵活性。动态代理的服务内容不需要像静态代理一样写在每个代码块中,只需要写在invoke()方法中即可,降低了代码的冗余度。Java动态代理使用Java原生的反射API进行操作,在生成类上比较高效 | 只能为接口创建代理 |
cglib代理 | cglib是一个强大、高性能的字节码生成库,它用于在运行时扩展Java类和实现接口;本质上它是通过动态的生成一个子类去覆盖所要代理的类(非final修饰的类和方法)。 | CGLIB使用ASM框架直接对字节码进行操作,在类的执行过程中比较高效,可以对非接口类进行代理 |