对Java动态代理的理解

关于java动态代理的理解

之前对java的动态代理有些误解,一直以为动态代理代理的是一个对象,其实这样的理解不是准确的(主要是因为面向对象思维的固化)。动态代理应该理解为代理方法而不是一个对象,代理的本质是为了加强方法的实现,在不改动源代码的基础上对方法的功能进行增强。(我个人理解其实就是代理方法=原方法+更多操作)。如下图,动态代理类Y的方法其实就是A+B+C方法的组合。当然,在代理方法中其实可以做任何你想做的操作,甚至什么都不做都可以。

下面我说一下我见过的两种常见的动态代理模式

1.aop

aop其实就是在原来的方法前后加上一些操作(即代理方法=before方法+原方法+after方法)因此在handler(继承了invocationHandler)类中要传入原方法的对象(subject)从而来调用原方法。网上的大部分对于动态代理的帖子都是用的这种例子,这正是应为这样造成了我对动态代理的误解,以为所有的动态代理类都要传入一个对象才行。事实上,只需要提供一个接口即可,动态代理就是实现接口里的方法,在这个方法里其实可以做任何的操作。

 

2.Mybatis的MapperProxy

mybatis框架也使用了动态代理,从下图可以看到,mybatis的动态代理和aop不一样的地方就在于,不需要传入一个代理对象来调用方法而是调用自己的方法(调用mapperMethod.execute()方法)。

 

总结

1.动态代理就是在运行时动态生成对象,这个对象是用来代理方法的。

2.在这个动态代理对象的invoke方法中可以做任何操作。如果需要aop功能,则只需在invoke中加入被代理对象的方法和before、after方法即可。

原文地址:https://www.cnblogs.com/lanqi/p/7851855.html