java代理的缘由及java动态代理
Posted xxfs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java代理的缘由及java动态代理相关的知识,希望对你有一定的参考价值。
一、java代理出现的原因
1.代理在java中是什么? java号称万物皆对象,而实例对象的类 本身涵盖两个类型(类中嵌套类先不作分析),一是成员属性(表示这个对象是什么,拥有什么),而是成员方法(表示这个对象的动作,做什么)。
所以,“代理”主要就是在动作这一块增加的处理。而动作怎么增加处理呢,如果是在该方法内部去改变,那么就是这个方法的本身动作得到了改变,动作原有想表达的含义就改变了,这形成破坏且不合理。
那基于此,需要在此方法之前处理或者之后处理。而java本身的方法有个特性,就是栈式调用。
这个栈式调用是什么意思呢,java的逻辑处理都是在方法内部进行的。而所有的入口都是一个方法,main()。而方法的调用都是一直向里层叠的。比如 main() a.a(); b.b(); ,会先执行完a的a方法,才会去执行b的
b方法,最后main方法执行完,因为线程执行本身也是出入线程栈的概念。栈的出入顺序也就是先入后出,后入先出。
接第一段,代理的目的是需要对一对象的某动作去增强且不会改变内部逻辑,那么以main() a.a(); b.b(); 这种方法,在b方法之前调用a方法,也可以说是能够对b动作的一种增强。然而如果需要对b的b方法每一次
都要“增强”,那么执行之前都需要加一段a方法。会产生冗余重复。
如果是换种方式呢。main() a.a( )b.b();; 在a的a方法内部去先实现a方法的逻辑,尾部再调用b方法,那么也是一种增强方式。如此便是静态代理。在a所在类内部注入一个b对象的引用,那么每次a的a方法被调用
都可以继续调用b方法,而在外部不需要再次对b方法去调用,那么就是说,b的b方法都被a的a方法去代理了。
如果a中还有a1,a2,a3.需要去代理,那么如果根据上面的静态代理,我需要重新写个b1,b2,b3 然后跟a方法一样包裹。那在某些场景不优雅且不便利。那么怎么解决呢,需要模糊方法调用,就是我可以在a的a
方法内部去调用所有的方法,而只需要知道我本身要调用b的哪个方法。
以上是关于java代理的缘由及java动态代理的主要内容,如果未能解决你的问题,请参考以下文章