我在前文当泛型的参数类型是动态的... 中以一个简单的例子引出了动态代理,我们使用动态代理,主要是因为动态代理拥有这样的能力--使得某个类型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可以从
当泛型的参数类型是动态的... 的文末下载。
分享到:
相关推荐
using Castle.DynamicProxy; public class SimpleSamepleEntity { public virtual string Name { get; set; } public virtual int Age { get; set; } public override string ToString() { return string....
Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...
本文将深入探讨如何使用Spring的IOC和DI特性,结合动态代理(Dynamic Proxy)来实现一种类似AOP(面向切面编程)的功能,以达到在不修改原有代码的情况下增强或拦截方法调用的目的。 **一、Spring IOC(控制反转)*...
在WCF中,可以使用`Castle.DynamicProxy`库或者.NET Framework的`System.Reflection.Emit`命名空间来创建动态代理,从而在调用WCF服务时添加日志、事务控制等特性,而无需修改服务契约接口。 **WCF动态调用** 是指...
Castle.DynamicProxy是一个强大的动态代理库,它允许我们在运行时创建类的代理,这些代理可以拦截并处理方法调用、属性访问等。通过使用Castle.DynamicProxy,我们可以创建一个动态代理类,该类将作为IBatisNET中的...
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 ...
**Java动态代理(Dynamic Proxy)** Java动态代理是Java提供的一种机制,可以在运行时创建具有特定接口的代理类。这通常用于实现AOP(面向切面编程)或事件处理等。主要由java.lang.reflect.Proxy和java.lang....
这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
绿色软件,无需安装,可以自动添加、修改代理服务器ip地址
在上面的示例中,我们定义了一个动态代理类DynamicProxy,它实现了InvocationHandler接口。我们可以通过DynamicProxy对象来代理RealSubject对象,并对其方法调用进行处理和修改。 四、结论 Java动态代理语法Proxy...
Service dynamicProxy = (Service) Proxy.newProxyInstance( Service.class.getClassLoader(), new Class[]{Service.class}, new DynamicProxy(new RealService()) ); dynamicProxy.doSomething(); ``` 动态...
如果使用LinFu.DynamicProxy动态代理,引用NHibernate.ByteCode.LinFu.dll程序集并配置proxyfactory.factory_class节点为 <property name="proxyfactory.factory_class"> NHibernate.ByteCode.LinFu....
在动态代理中,我们创建了一个 `DynamicProxy` 类实现 `InvocationHandler` 接口,然后使用 `Proxy.newProxyInstance()` 方法创建代理对象。`invoke()` 方法会拦截所有对代理对象的方法调用,从而可以在调用前后添加...
2. 在`DynamicProxy`类中定义`getDynamicProxy`静态方法,使用`Proxy.newProxyInstance()`方法创建动态代理实例。 3. `DynamicProxy`类重写`invoke`方法,在调用目标对象方法前后的操作,比如记录日志或性能监控。 ...
`Proxy` 类是用于创建动态代理对象的工厂,而`InvocationHandler`接口则定义了代理对象如何处理方法调用的逻辑。 1. **Proxy类**: `Proxy` 类提供了`newProxyInstance()`静态方法,它是创建动态代理对象的主要...
在动态代理中,我们创建了一个实现了 `InvocationHandler` 接口的 `DynamicProxy` 类。`invoke()` 方法是关键,它会在调用真实对象的方法之前和之后添加额外的逻辑。使用 `Proxy.newProxyInstance()` 可以生成一个...
主要写了静态代理、动态代理、还写了URL的使用,其实就是下载的原理了。 动态代理动态代理动态代理动态代理
在Java编程中,动态代理(Dynamic Proxy)是一种强大的设计模式,它允许我们在运行时创建具有特定接口的新对象。Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口...
Service proxyService = (Service) DynamicProxy.getProxyInstance(realService); proxyService.doSomething(); ``` 代理模式在软件开发中有广泛的应用,例如在远程调用、事务管理、缓存控制、权限验证等场景。在...