Java学习(动态代理的思想详细分析与案例准备)(1)

目录

一、什么是动态代理?

(1)代码案例与图解分析。

1、侵入式修改?

2、使用"代理"及"代理"的特点。("非侵入式")

二、程序为什么需要代理?代理长什么样子?

(1)实际生活的案例。

(2)解释:程序中为什么需要代理?

(3)解释"代理"长啥样?

(4)java中的"代理"类是如何明白需要被代理的方法?

三、根据上方案例,通过代码展示实际"代理"结果。

(1)接口。(内部的抽象方法:所有需被代理的方法)

(2)被"代理"对象所在类。

(3)"代理"类。(java.lang.reflect.Proxy)


一、什么是动态代理?

(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) {
        this.name = name;
    }

    //提供对应的getter、setter方法。
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //提供对应的成员方法

    /**
     * 唱歌成员方法
     * @param songName 歌名
     * @return
     */
    @Override
    public String sing(String songName) {
        System.out.println(this.name + "正在唱歌:"+ songName);
        return "唱歌完毕!谢谢大家...";
    }

    /**
     * 跳舞成员方法
     * @return
     */
    @Override
    public String dance() {
        System.out.println(this.name + "正在跳舞:");
        return "跳舞完毕!谢谢大家...";
    }


}
(3)"代理"类。(java.lang.reflect.Proxy)
  • 具体的实现在下篇博客完成。下方的"代理"对象的实现思路图由"黑马程序员"提供。

  • 本篇博客的主要内容是进行Java中动态代理的思想分析与思路学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁岁岁平安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值