静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理能够对不论什么实现某一接口的类进行功能性增强。
在java中动态代理由InvocationHander来实现。
HelloInterface接口
[java] view plain copy
proTest类实现了InvocationHandler类
package proxy;import flect.InvocationHandler;
import flect.Method;
import flect.Proxy;
// 实现InvocationHandler接口
public class proTest implements InvocationHandler {Object anyObject;// 申明bind方法public Object bind (Object anyObject){this.anyObject = anyObject;Class().getClassLoader(), Class().getInterfaces(), this);}// 重写invoke方法@Overridepublic Object invoke(Object arg0, Method arg1, Object[] args)throws Throwable {Object returnObject = null;System.out.println("动态代理開始");returnObject = arg1.invoke(anyObject, args);System.out.println("动态代理结束");return returnObject;}public static void main(String[] args) {proTest proTest = new proTest();HelloInterface helloInterfaceReturn = (HelloInterface)proTest.bind(new HelloInterfaceImpl());helloInterfaceReturn.sayHello();}
}
在main方法中调用proTest对象的bind绑定方法将一个实现类与一个动态代理进行绑定。动态代理主要由下面代码来实现
Class().getClassLoader(), Class().getInterfaces(), this);
将输入的anyObject对象与接口进行动态关联。这样就能够避免静态接口固定的缺陷了,动态代理由原来的静态代理面向接口转向动态代理面向实现类,这样设计的出发点不是对接口,而是动态的取的接口。软件的灵活性大大的提高。 当调用被代理的HelloInterfaceImpl类实例的方法时,系统将转到包括代理类proTest的InvocationHandler的invoke方法中运行对应的代码,动态代理的过程结束。
public class proTest implements InvocationHandler类不在服务于某一个接口。静态代理和动态代理都是针对于sayHello()方法进行增强,不支持field字段级的增强。
Spring觉得那已经在破坏面向对象编程的结构,所以支持方法的增强是再合适不的,并且与Spring的其它模块进行整合开发时会更有集中性。
posted on 2017-08-06 14:03 mthoutai 阅读( ...) 评论( ...) 编辑 收藏
转载于:.html
本文发布于:2024-01-29 13:00:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650443715463.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |