java中动态代理实现机制

  • 时间:
  • 浏览:0

  第五个参数表示调用方式的Method对象;

  其中,javadoc上说你同类于于invoke()方式还后能 能用于相同类于中的同类于于对象的方式执行,也就说 说你同类于于方式中的obj须要传入相同有有另一个多多 类的曾经对象(上述方式中就说 传入了Arithmetic类的不同对象,而且会进入无限递归循环(测试时候还居然经常突然出现了StackOverflowError)。仔细的想一想就会发现,public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy)中的target是实现的代理类对象,通过target调用add()方式还会触发intercept()方式被调用,由于 在intercept()方式中再调用method.invoke(target, args),就要花费add()方式中又调用add()方式,由于 无限的递归循环。而且由于 执行method.invoke(real, args)则我不多 ,由于 real和target是同有有另一个多多 类不同对象,real是真实逻辑主题,target是真实主题real的代理。

  注意了,实现2中Enhancer 没有 设置接口,由于 设置了Superclass了(也就说 代理类的父类是Arithmetic),我们歌词 都 的代理类会继承它,而Arithmetic由于 实现了我们歌词 都 的接口。为了证明你同类于于点,还后能 能在MethodInterceptor的 intercept方式中打印 target.getClass()的类信息,我就发现cglib的某种方式代理类的父类是不同的。如下:

  method代表调用方式的Method对象,proxy是代理类产生并代替method的对象,而且用method.invoke(target, args)会产生无限循环调用。

  MethodInterceptor接口的实现

  第有有另一个多多 参数表示此次调用的输入参数列表;

  代理模式是常用的java设计模式,它的底部形态是代理类与委托类有同样的接口,代理类主要负责为委托类预避免消息、过滤消息、把消息转发给委托类,以及事后避免消息等。代理类与委托类之间通常会地处关联关系,有有另一个多多 代理类的对象与有有另一个多多 委托类的对象关联,代理类的对象某种未必真正实现服务,就说 通过调用委托类的对象的相关方式,来提供特定的服务。 

  (来自:http://cuishen.iteye.com/blog/421464),代码注释很删剪,仔细研究一下就会懂了!

  创建代理类并调用代理类

  MethodInterceptor接口的实现

  Javassist是有有另一个多多 编辑字节码的框架,还后能 能我就很简单地操作字节码。它还后能 能在运行期定义或修改Class。使用Javassist实现AOP的原理是在字节码加载前直接修改须要切入的方式。这比使用Cglib实现AOP更加高效,而且没不多限制,实现原理如下图: 

  下面有有另一个多多 例子来模拟一下:

  创建代理类并调用代理类

    从参数构成上,methodInterceptor的输入参数比Invocationhandler多有有另一个多多 ,我觉得前五个参数对象的含义与Invocationhandler的含义是相同的。

  实现1:

  (由于 须要打印类信息代码,请参考:http://www.cnblogs.com/hujunzheng/p/5132943.html)

  javassist使用动态java代码常见代理过程和前文的方式略有不同。javassist组织组织结构还后能 能通过动态java代码,生成字节码。你同类于于方式创建的动态代理还后能 能非常灵活,甚至还后能 能在运行时产生业务逻辑。

   注意了,MethodProxy在对执行函数的时候,提供了有有另一个多多 方式

创建代理类并调用代理类

  打印一下动态实现接口的代码如下:

接口的实现

  Enhancer和MethodInterceptor。Enhancer还后能 能用来动态的生成有有另一个多多 类,你同类于于类还后能 能继承指定的有有另一个多多 类,实现指定的同类于于接口。一同,Enhancer在生成有有另一个多多 类时候须要指定有有另一个多多 Callback,当类方式调用时,方式的执行被分配给你同类于于Callback,MethodInterceptor是有有另一个多多 使用比较多的继承自Callback的接口,它也还后能 有有另一个多多 方式声明。

  注意:MethodHandler接口中invoke方式的定义,如下:

  我觉得Method的invoke()方式会根据obj的类型去调用对应的solve()方式,也就说 多态性。

  多出来的参数是MethodProxy 类型的,它应该是cglib生成用来代替Method对象的有有另一个多多 对象,使用MethodProxy比调用JDK自身的Method直接执行方式速率单位会有提升。

  第有有另一个多多 参数表示调用方式来自哪个对象;

  Java在JDK1.3后引入的动态代理机制,使我们歌词 都 还后能 能在运行期动态的创建代理类。使用动态代理实现AOP须要有五个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成有有另一个多多 代理类,而且在你同类于于代理类中织入代码。被代理的类是AOP里所说的目标,InvocationHandler是切面,它饱含了Advice和Pointcut。 

  实现2: