一、什么是动态代理?
(1)代码案例与图解分析。
1、侵入式修改?
- 学生类。如"吃饭"前需要"拿筷子"与"盛饭"两件事。
- 按照以前的Java思路。将其合并在"eat()"方法中。这样通过需求去直接修改对应的代码的方式叫:"侵入式修改"。
2、使用"代理"及"代理"的特点。("非侵入式")
- 为了不去修改原来的代码,又要新增新的功能!
- 寻找"代理"!简单说就是寻找一个中介人,帮你完成需要做的额外事情!
- 也就是:先让"代理"完成"拿筷子"、"盛饭"等操作。最后再去执行"吃饭"的操作。
- "代理"的特点:"无侵入式"的给代码增加额外的功能!
二、程序为什么需要代理?代理长什么样子?
(1)实际生活的案例。
- 有一位明星。他的日常工作是唱歌与跳舞。
- 但是因为"唱歌"需要提供话筒。"跳舞"需要提供场地。明星只想干工作的事情,工作外的事情不想做,而是交给经纪人(中介公司)做。
- 这个中介人就是他的"代理"。"代理"会帮明显打理其他除了工作外的琐事(准备话筒、准备场地、收钱等等...)。
(2)解释:程序中为什么需要代理?
- 在某个对象上如果需要做的事情过多,可以通过"代理"机制来转移部分的职责。
- 代理可以无侵入式的给对象增强其他的功能。(spring的AOP思想中叫"bean(对象)增强")
- 当"调用者"想要运行对象中的方法时,不是直接通过对象调用。而是"调用者"先去调用代理中的方法。代理会先执行准备工作,然后再有代理去调用对象的方法。
- 当有某公司邀请明星去唱歌或者跳舞。
- 明星会让它的代理去和公司商量价钱并准备"唱歌的话筒"、"跳舞的场地"。等到真正开始表演的时候,明星才会去执行"唱歌"或"跳舞"操作。
(3)解释"代理"长啥样?
- 对象有什么方法需要被代理。其"代理"也需要拥有对应的方法。
- "代理"里面就是对象需要被代理的所有方法。
- 但是"代理"中的方法与对象中的方法做的事情是有点不一样的。"代理"需要先把准备工作先完成,然后再去调用对象中的对应被代理的方法。(先准备话筒再唱歌、先准备场地再跳舞!)
(4)java中的"代理"类是如何明白需要被代理的方法?
- java程序中,在"代理"类、被代理类的对象的之间通过"接口"保证之间的联系。
- 被代理对象所在类与代理类都需要实现同一个接口中的方法。在接口中写入所有被代理对象需被代理的方法即可完成。
三、根据上方案例,通过代码展示实际"代理"结果。
- 本篇博客主要是被代理对象的准备工作。具体更详细的代码(代理类)在下一篇博客学习。
(1)接口。(内部的抽象方法:所有需被代理的方法)
- 接口。(Interface Star)
package com.fs.demo; public interface Star { //唱歌 String sing(String songName); //跳舞 String dance(); }
(2)被"代理"对象所在类。
- 明星类(Class BigStar)
package com.fs.demo; //明星实体类(需要代理类帮忙代理sing()、dance()方法) public class BigStar implements Star { //明星的姓名 private String name; //对应的构造方法 public BigStar() { } public BigStar(String name) { = name; } //提供对应的getter、setter方法。 public String getName() { return name; } public void setName(String name) { = name; } //提供对应的成员方法 /** * 唱歌成员方法 * @param songName 歌名 * @return */ @Override public String sing(String songName) { System.out.println( + "正在唱歌:"+ songName); return "唱歌完毕!谢谢大家..."; } /** * 跳舞成员方法 * @return */ @Override public String dance() { System.out.println( + "正在跳舞:"); return "跳舞完毕!谢谢大家..."; } }
(3)"代理"类。(java.lang.reflect.Proxy)
- 具体的实现在下篇博客完成。下方的"代理"对象的实现思路图由"黑马程序员"提供。
- 本篇博客的主要内容是进行Java中动态代理的思想分析与思路学习。