我在前文当泛型的参数类型是动态的... 中以一个简单的例子引出了动态代理,我们使用动态代理,主要是因为动态代理拥有这样的能力--使得某个类型A在运行的时候能转化为一个指定的接口I,即使这个类型A在定义的时候并没有从这个指定的接口I继承。 这句话是什么意思了?还是回到当泛型的参数类型是动态的... 一文中的那个例子,在例子中,List<>并没有从ISimpleList继承,但是从表面看来,在运行的时候,我们通过动态代理可以以ISimpleList接口来“引用”List<>类型的对象。
动态代理是在运行时在内存中构建的一种类型,该类型实现了接口I,但是它将所有的方法调用都转发给类型A。
注意,上面我使用了“方法”调用的转发,由于,事件、属性都是方法的变体,所以,对接口中定义的所有元素的Call都可以被动态代理转发。那么,接口(I)中的方法与被代理者(Target)的方法如何匹配起来了?通常的方法是,进行“同名”匹配,比如ISimpleList接口的Add方法就自然匹配到List<>的Add方法。对于复杂的需求,可以定义一个方法名映射表来匹配不同名的方法。
由于,动态代理拥有这种为类型(Target)“换脸”的能力,所以,在很多场合可以使用它来优雅地解决一些以前难以处理的问题(通常,以前我们使用反射来解决这些麻烦),比如:
(1)“泛型参数类型是动态的”,使用动态代理解决这种问题不仅可以避免反射带来的性能损失,而且还可以获得强类型方法调用的好处。
(2)为一组类型“变脸”。比如,TextBox、RichTextBox、ListView等windows控件都有Clear方法,但是它们都没有实现一个统一的接口(比如,该接口中定义了Clear方法),所以当我要清空某个GroupBox中所有控件的内容时,无法用一种统一的方式调用,你不能这样做:
foreach(Controlcontrolinthis.groupBox1.Controls)
{
control.Clear();//Control不存在Clear方法,编译报错
}
但是有了动态代理之后,我们就可以为这些控件定义一个New Face:
publicinterfaceINewFace
{
voidClear();
}
然后优雅地这样调用:
foreach(Controlcontrolinthis.groupBox1.Controls)
{
INewFaceface=DynamicTypeEmitter.CreateDynamicProxy<INewFace>(control);
face.Clear();
}
(3)使用动态代理除了转发调用外,可以为之注入预处理和后处理,这就是AOP的功能。Spring.NET的AOP实现即是通过动态代理做到的。
你可以继续挖掘使用动态代理的其它场合,发挥你的想象力,来展现动态代理的威力。
ESBasic.dll可以从
当泛型的参数类型是动态的... 的文末下载。
分享到:
相关推荐
java 反射与动态代理Reflection&DynamicProxy,源码展示
Castle Dynamic Proxy代理使用
SpringIOC,DI+dynamic proxy 实现盗版AOP的源代码
package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...
这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!
绿色软件,无需安装,可以自动添加、修改代理服务器ip地址
如果使用LinFu.DynamicProxy动态代理,引用NHibernate.ByteCode.LinFu.dll程序集并配置proxyfactory.factory_class节点为 <property name="proxyfactory.factory_class"> NHibernate.ByteCode.LinFu....
主要写了静态代理、动态代理、还写了URL的使用,其实就是下载的原理了。 动态代理动态代理动态代理动态代理
动态代理一个简单实用的JDK动态代理演示
NULL 博文链接:https://lionkingzw-hotmail-com.iteye.com/blog/485923
动态代理框架源码 /// 说明: /// 在第一次需要用到代理时动态生成代理类,之后的使用均调用已经生成的代理类 /// 规则: /// 1.不能为接口创建代理类代理类 /// 2.父级必须有空的构造函数 /// 3.只重写...
java 动态代理的前世今生 dynamic proxy in java
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。...
java static proxy dynamic proxy
└─dynamicproxy └─src └─com └─dynamicproxy ├─entity │ Subject.java │ ├─entityimpl │ SubjectImpl.java │ ├─main │ Test.java │ └─proxy AbstractDynamicProxy.java ...
本资源利用文档加源码的方式较详细的介绍了JDK 动态代理和Spring的AOP机制.相信对您理解相关方面的知识有很大作用.
程序员姓名:Daryl Varghese 和 Kishan Patel 动态代理/Madleets 代理 v1.0 是为 madeets.com 制作的动态代理。 代理应用程序从 hidemyass.com 获取最佳代理并实时更改系统代理配置。 特点: 1.适用于所有windows...
Java动态代理 动态代理实现
程序名称:Daryl Varghese和Kishan Patel动态代理/ Madleets代理v1.0是为madleets.com开发的动态代理。 代理应用程序从hidemyass.com获取最佳代理,并实时更改系统代理配置。 功能:1.它可以在所有Windows系统(32位...
Latest version router 1.2.8 —— modified code to avoid concurrent bugs ...> what's dynamic proxy and how to use , see my blog 代理模式的学习与应用 Background EventBus is good ,but there are some pr