直奔主题,
静态代理
由程序员创建或工具生成代理类的源码,再编译代理类。在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了
-
优点
业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
-
缺点
1.代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
2.如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
动态代理
动态代理类的源码是在程序运行期间由JVM根据反射等机制 动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
-
优点
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
-
缺点
Proxy 已经设计得非常优美,但是还是有一点点小小的遗憾之处,那就是它始终无法摆脱仅支持 interface 代理的桎梏,因为它的设计注定了这个遗憾。回想一下那些动态生成的代理类的继承关系图,它们已经注定有一个共同的父类叫 Proxy。Java 的继承机制注定了这些动态代理类们无法实现对 class 的动态代理,原因是多继承在 Java 中本质上就行不通。
参考链接
https://blog.csdn.net/ikownyou/article/details/53081426