java动态代理
2016年10月20日 00:00
概述
动态代理是java的一大特性,动态代理的优势就是实现无侵入式的代码扩展。它可以增强我们原有的方法,比如常用的日志监控,添加缓存等,也可以实现方法拦截,通过代理方法修改原方法的参数和返回值等。
要了解动态代理,我们需要先看看什么是静态代理
静态代理
首先你有一个接口:
1 | public interface Api { |
这个接口有一个原始的实现:
1 | public class ApiImpl implements Api { |
现在问题来了,有一个新的需求,我需要在所有调用doSomething的地方都添加一个log,那怎么办呢?我们当然可以在原有代码上直接加上log,但是ApiImpl里面的log真的是那段代码需要的吗?如果不修改原有代码,能不能实现?当然可以,如,我们添加一个代理类:
1 | public class ApiProxy implements Api { |
这样,通过ApiProxy我们就是实现静态代理,这里只是简单的添加了log,我们完全可以在ApiProxy的doSomething方法里面,篡改输入参数input以及返回值,从而做一些坏事~
动态代理
在上面静态代理例子中,我们已经实现了代理的功能,那为何还需要动态代理呢?设想一下以下两种情况
- 如果Api接口类中有100个方法,需要为每个方法都添加log
- 项目中有100个类,需要为每个类的方法都添加log
对于第一种情况,如果使用静态代理,那就只能这样了: