革庭法律网

    什么叫代理Java 作用是什么?

    来源:http://www.gt0577.cn 发布时间:2020-12-27 点击数: 67

      如果不懂就无法深入理解当下最流行的诸多框架的原理,如spring。

      如果不懂大厂的offer很可能和你插肩而过。

      很早就想写一篇的文章,正好看到这个问题,在回答之前我找了一些资料发现不是艰涩难懂就是模糊不清,于是我把其中最难懂的部分提炼出来,反复揣摩,用最易于理解的语言细致描述,形成了这个回答,辛苦努力没有白费,发布的这几天浏览量超过两千,收藏量也过了几百,谢谢知友们的支持~

      最简单的方法:在打印的功能前面直接加上记录日志的功能。

      看上去好像没有问题,但是我们修改了打印机的源代码,了面向对象的开闭原则,有可能影响到其它功能。怎么解决呢?很容易可以想到,既然不能修改原来的代码,那我新建一个类吧。

      这个类继承了打印机的类,重写了打印机的print方法,什么叫代理提供了记录日志的功能,以后需要打印机的时候使用这个类就好。问题似乎得到了解决,我们可以在这个解决方案的基础上进一步的优化:

      创建打印机代理类也实现该接口,在构造函数中将打印机对象传进去,实现接口的打印方法时调用打印机对象的打印方法并在前面加上记录日志的功能:

      以后我们就可以直接实例化PrinterProxy对象调用它的打印方法了,这就是静态代理模式,通过抽象出接口让程序的扩展性和灵活性更高了。

      考虑一下,如果我的打印机类中还有别的方法,也需要加上记录日志的功能,就不得不将记录日志的功能写n遍。进一步如果我还有电视机,电冰箱的类里面的所有方法也需要加上记录日志的功能,那要重复的地方就更多了。

      要想不重复写记录日志的功能,针对每一个接口实现一个代理类的做法肯定不可行了,可不可以让这些代理类的对象自动生成呢?

      Jdk提供了invocationHandler接口和Proxy类,借助这两个工具可以达到我们想要的效果。

      接口里只有一个方法invoke,这个方法非常重要,先混个脸熟,稍后解释。

      实现一个类,该类用来创建代理对象,它实现了InvocationHandler接口:

      被代理的对象targetObject可以通过方法参数传进来:

      对象就是通过调用这段代码被创建并返回的。

      this:也就是当前对象即实现了InvocationHandler接口的类的对象,在调用方法时会调用它的invoke方法。

      这个方法就是生成的代理类中的方法被调用时会去自动调用的方法,可以看到在这个方法中调用了被代理对象的方法: method.invoke(targetObject, args);

      我们可以在这里加上需要的业务逻辑,比如调用方法前记录日志功能.

      当执行printer.print();时会自动调用invoke方法,什么叫代理很多初学者不理解为什么能调用这个方法,回忆一下创建代理对象的时候是通过

      将被代理的对象作为参数传入就可以执行里面的任意方法,所有的方法调用都通过invoke来完成。不用对每个方法进行处理,是不是很简洁。什么叫代理

      代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介,和静态代理的区别在于静态代理我们需要手动的去实现目标对象的代理类,而可以在运行期间动态的生成代理类。

      如果你想对java有更深入的理解可以看看我的这个回答,里面了我所有的高赞回答和文章:

      我精心写了几个大厂面试必考知识点的文章,无论是对于完善你的技术栈还是准备面试都会大有裨益::

      【文末彩蛋】最后,还给已经点赞,勤奋好学的你,送出java精华合集一份,里面包括我精心编写的java面试考点详细解析近两百本java经典:包括大名鼎鼎的《hd first java》《深入理解Java虚拟机_JVM高级特性与最佳实践》 等java人员耳熟能详的巅峰之作。认真学习,将大大提升你的java水平,让你在面试中披荆斩棘有兴趣的朋友,关注 『“极简Java学习营”』。。

      喜欢,请点赞关注『夏昊』一个研究java,拥有十多年经验的技术控。

      码字不易,如果文章对你有收获的,请点赞收藏,

    原文标题:什么叫代理Java 作用是什么? 网址:http://www.gt0577.cn/zhaiwu/2020/1227/194532.html