如何通俗易懂的理解JAVA的动态代理模式

首先,本文是对https://blog.csdn.net/briblue/article/details/73928350的一个小结,适合小白看,欢迎大家去该地址阅读。

而且要理解动态代理,需要对于java反射的概念有所了解,不了解的同学可以先去了解下反射的基础概念。

什么是代理

首先 代理,从汉语去理解的话,就是我本来自己一个人能做的事,我不亲自去做,让另一个人帮我做。这个人就是代理。

比如,我现在要对象A执行一个方法B,对于最基本的Java代码肯定就是直接A.B().

这样肯定是可以实现的。但是存在什么问题呢?

存在的问题

如果我现在要加入操作:比如我要求我在B方法之前我要先实现一小段功能F1,在B之前实现一小段功能F2。

例如:F1为输出“开始了”,F2为输出“结束了”,该如何做?

解决办法

也许有人会问,这还不简单,打开B方法源码,在方法开头syso,在方法后面syso,轻轻松松,我干嘛还要学动态代理,难道是嫌程序员太闲了? 当然不是,修改源码固然在功能上是可行的,你能够每次功能改变都去修改源代码吗?而且你知识syso一下还好,如果是一大段代码呢?你源码的维护是不是很困难?


所以,我们才会有代理的思想,就是说,我不修改你源码了,我让一个“中间类”来办这件事,来调用你的方法,然后我在中间类中,我想怎么实现,想怎么添加都行。这样是不是极大的保护了源码,而且下次你功能优点变化,我修改修改代理类,实在不行,我重新定义一个代理类,这样的维护成本是不是比你直接修改源码要强?这就是AOP(面向切面编程);

实现

那现在来实现,实现代码在开头的文章有,大家可以看一下。

本文主要就是对该文章的一个补充,下面解释下,我在学习过程中遇到的难点。

Proxy.newProxyInstance(MaoTaiJiu.class.getClassLoader(),MaoTaiJiu.class.getInterfaces(), handler);

这是一个静态方法,主要是创建一个动态代理。那么既然是代理,被代理的类是哪一个呢?这里就是反射的概念。因为被代理的对象有很多很多,不可能挨个去写一个代理方法,因此我们利用反射原理。我既然要代理,那么我这个代理里面一定要有这个对象。就是说,我柜台必须要有酒才能卖酒。因此,在代理里面我必定要有一个酒的属性,但是,如何创建?那按照反射思想,我传进这个类的一个构造器,那么我就可以创建这个类的对象,从而可以调用其中的方法。问题又来了,我根本不知道接口名称啊,怎么调用。那就用反射来获得这个类要代理的接口,本例只有一个方法,所以全部即可;handler,即为InvocationHandler 对象,即继承 该类的代理类,该类的invoke方法主要就是实现代理功能,其中method.invoke()就是反射原理中去执行你之前传入方法。然后你可以实现自己的操作。最终返回一个Object对象,你可以cast为任意对象,最好为接口类型。体现面向接口编程,然后用该接口对象调用方法即可实现功能。



如有错误,请指正,多谢。


                           

你可能感兴趣的:(如何通俗易懂的理解JAVA的动态代理模式)