动态代理(超级详细)

本文详细介绍了Java动态代理的概念,解释了为什么需要动态代理,并通过一个明星与经纪人的例子阐述了代理模式的工作原理。动态代理可以帮助无侵入地给对象添加额外功能。代理对象通常包含原始对象的所有方法,但在调用时会进行预处理。Java中,动态代理的创建主要通过java.lang.reflect.Proxy类完成。
摘要由CSDN通过智能技术生成

动态代理(超级详细)

一:什么是动态代理?

举个例子,加入Student类里面有一个eat方法,现在我要去给这个方法去增加其他功能。比如吃饭之前要去拿筷子,盛饭。按照以前所学,我们只能把这两段代码都写在eat方法中,此时直接去修改代码,叫做侵入式修改。以后在一个成熟的项目当中,一般很少会去这么干。

问题来了,我现在不能去修改原有的代码,又要增加额外的功能,这个时候该怎么办?

此时我们就得去找一个代理,什么是代理?说白了就是中介公司,他会帮你先去做拿筷子和盛饭这两个准备工作,等真正吃饭了,再去调用Student里面的eat方法去吃饭,这个就是动态代理。

所以关于动态代理可以这么去理解:动态代理可以无侵入式的给代码增加额外的功能。

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

程序为什么需要代理?坤坤是一个大明星,非常厉害,能唱能跳,在程序当中反应出来就是在它的身上有sing()方法和dance()方法,。由于坤坤是一个大明星,唱歌跳舞不能太随便。比如唱歌跳舞的方法里面他得先准备话筒,准备场地,再去收钱,然后才能开始唱歌和跳舞。但是要注意了,这两个新增的功能,是写在方法的里面吗?如果不知道,就这样想:坤坤是一个大明星,干这些小事情很烦。所以坤坤会去找一个经纪公司,告诉他们我能唱能跳,但是有一些麻烦的事情你们得去帮我搞定。中介公司听到了就会给坤坤派去经纪人,也就是代理。代理会去帮坤坤去打理这些琐碎的事情。所以为什么需要代理?对象如果嫌身上干的事情太多了,可以通过代理来转移部分职责。

代理长什么样?在代码当中,代理长什么样说白了就是代理的里面可以写什么样的方法。你觉得这个代理里面能有什么方法呢?先告诉大家结论:它肯定是有唱歌和跳舞的方法。为什么?如果现在有人要让坤坤去唱歌和跳舞,坤坤怎么办?坤坤肯定会说,你别找我了,去找我的代理吧,此时这个人就会去找中间的代理。如果这个时候发现,代理的身上没有唱歌和跳舞的方法,你说这个人会怎么想?他会想你逗我呢?到底能不能唱歌能不能跳舞?所以说我们中间的代理,如果说想要代理坤坤,那么代理的身上就必须要有唱歌和跳舞的方法。但是话又说回来了,你说代理会唱歌会跳舞吗?代理是不会的。代理里面的方法我们一般会这么写:你找我唱歌,那我就先准备话筒,收钱,然后再去调用坤坤的唱歌方法,让坤坤去唱歌。跳舞也是一样的:代理先去准备场地,收钱,然后再去调用坤坤跳舞的方法,让坤坤来跳舞。这就是代理在代码当中长的样子。对象有什么方法想被代理,代理就一定要有对应的方法。只不过方法里面干的事情是不太一样的,代理会先把准备工作做完,然后再去调用对象当中的方法。

在正式写代码之前,还有一个小细节需要知道:中间的这个代理,它是如何知道坤坤要代理唱歌和跳舞的这两个方法?万一还有第三个打篮球呢?所以为了解决这个问题,在代码当中,我们是通过接口来搞定的。在事先会定义一个接口,有唱歌和跳舞两个方法,注意!在这个接口里面所有的方法就是我们想要代理的方法。如果你想要代理唱歌和跳舞,你就把唱歌和跳舞写在接口当中。如果你想要代理唱歌跳舞和打篮球,你就把唱歌跳舞和打篮球写在接口当中。写完了接口之后,代理和坤坤都要去实现中间的这个接口才是可以的。

public interface Star {
   
    sing方法
    dance方法
    // 把要代理的方法写在这个接口中,然后代理和坤坤都去实现这个接口
}

下面在代码当中看看如何实现动态代理:

public interface Star {
   
    // 我们可以把所有想要代理的方法定义在接口当中

    // 唱歌
    public abstract String sing(String name);

    //跳舞
    public abstract void dance();
}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值