什么是代理?举个例子,最形象的代表便是经纪人,明星一般都有经纪人,经纪人作为中间人,负责代理明星的相关事宜;经纪人就是代理;
1 | public interface IStarts{ |
现在创建一个代理类:
1 | public class StartProxy implements IStart{ |
上面的测试,可以看出,实际上代理类只是保存了Start类饿一个实例,实现的是相同的接口,StartProxy类必须实现dance和sing方法,你可以这么理解:代理接的活和实际做的是一致的,只是交给了具体的Start来实现;
那么,为什么要使用代理呢?
其实,主要目的是为了扩展原有类的功能,代理类实现了相同的接口,做的事情是一样的,只不过可以控制Start在何种条件下去执行,比如需要统计唱歌和跳舞的次数,次数大于3则不进行该操作,直接返回.这时候,使用代理就很好地实现,把代理类做如下修改:
1 | public class StartProxy implements IStart{ |
当然,这里仅仅是一种代理饿思想,用这种代理思想可以比较方便的在不修改原有类的前提下对原有类进行扩展;
但是,限制也是显而易见的:
1.代理类需要与被代理类实现相同的接口
2.当被代理的类需要进行的扩展增多时,管理会变得更加困难,之后对被代理类的修改,同时需要修改代理类
动态代理,指的是运行时创建代理对象,动态代理具有更强大的拦截请求功能,因为可以获取类的运行时信息,所以可以根据运行时信息来获取更加灵活的执行
还是以明星和经纪人作为例子;
修改代理类;创建JDK动态代理需要先实现InvocationHandler接口,并且重写其中的invoke方法,具体步骤如下:
1.创建一个类实现InvocationHandler接口
2.给Proxy类提供委托类的ClassLoader和Interfaces来创建动态代理类
3.利用反射机制得到动态代理类的构造函数
4.利用动态代理类的构造函数创建动态代理类对象
1 | public class StartNewProxy implements InvocationHandler{ |
新建一个工厂类来返回代理实例:
1 | public class StarsNewProxyFactory { |
动态代理跟静态代理最大的不同便是生成代理类的时期不同,静态代理是在编译期,而动态代理则是在运行时根据委托类信息动态生成。
- 本文作者: Kiven
- 本文链接: http://hzxstudio.com/2018/07/19/wonderful/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!