java基础知识——27.动态代理
这篇文章,我们来学一下java的动态代理
目录
1.动态代理的介绍
2.具体的代码实现
1.动态代理的介绍
动态代理:无侵入式的额外给代码增加功能
很不好理解,下面,我们通过两个例子来说明一下什么是动态代理:
例一:
如上图所示,我有一个学生类,里面有个方法,现在我想增强这个方法,即给这个方法增加点内容,怎么做?按照我们以前的思维肯定是直接把这些代码写进去就行,其实在实际开发中,这样做是很不对的,因为这样做很容易破坏代码的稳定性。
这时我们就可以用代理来做。 如下图所示:
意思就是我们找个中介,这个中介先帮我们完成那些要增强的内容,然后我们再运行我们的内容。这个中介就是代理
例二:
假设,我们现在有一个明星,他会唱歌和跳舞,用我们程序表现出来就是一个明星类,里面有唱歌方法和跳舞方法。现在,我们要给这个方法增强,反映到实际上就是他跳舞前需要准备话筒,收钱;跳舞前需要准备场地,收钱。但是一个明星明显不会管这些事情,这时候这个明星就会去找经济公司,让经济公司帮他做这些事情,他只管唱跳就行。那么代理里面有什么内容呢?我们再结合实际想,一个活动邀请一个明星去参加,肯定是先和这个明星的经纪人联系,那么经纪人就要明码标价了啊,说明明星会哪些技能,会哪些歌曲,会哪些舞蹈。所以,代理里面一定有要代理类的方法。但是啊,经纪人不会唱跳啊,所以经纪人还要找明星,让明星去唱跳。所以,整个流程就是,我们外部需要调用这个增强的方法,我们应该去调用代理,然后让代理去调用原始类中的方法。
结合上面的内容,下面回答两个问题
问:程序为什么需要代理?代理长什么样?
答:对象如果嫌身上干的事情太多的话,可以通过代理来转义部分职责;对象有什么方法想被代理,代理就一定要有对应的方法。
问:代理如何知道你类要有哪些方法需要被代理呢?
答:通过接口知道的。我们类中所有要被代理的方法都要写在接口中,然后代理就能够通过接口知道有哪些方法需要被代理,然后实现它。其中,我们的类也要实现这个接口。
问:如果为java对象创建一个代理对象呢?
答:见下图:
2.具体的代码实现
下面,我们就来看一下动态代理的具体代码实现:
标准JavaBean:
接口(里面写要代理的方法):
具体的代理类:
测试类:
测试结果:
下面说一下代码的整体执行流程:
第一步,运行主方法,创建BigStar类对象cxk,然后创建代理类对象proxy,传入BigStar类对象cxk,然后我们通过代理类对象来调用方法,视线来到左边,首先,我们调用java中Proxy类中的创建代理类对象的方法,里面有三个参数,第一个是加载代理类的,第二个是找代理方法的(就是接口),然后第三个是增强方法的,而第三方法中呢,我们又有代理类对象的参数(没啥用不用管),然后是代理方法的参数,看到右下角第16行,就是那个sing,然后还有方法的形参,也是那个16行,然后就进入方法里面,然后就直接执行方法了。这就是整个过程
有一说一,这东西看起来挺复杂的。大家尽量理解吧。如果上面有错误或者大家有什么好的想法可以在评论区留言。感谢大家。