动态代理DynamicProxy 介绍

简介: 我在前文当泛型的参数类型是动态的... 中以一个简单的例子引出了动态代理,我们使用动态代理,主要是因为动态代理拥有这样的能力--使得某个类型A在运行的时候能转化为一个指定的接口I,即使这个类型A在定义的时候并没有从这个指定的接口I继承。
    我在前文 当泛型的参数类型是动态的... 中以一个简单的例子引出了动态代理,我们使用动态代理,主要是因为动态代理拥有这样的能力--使得某个类型 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  (Control control  in   this .groupBox1.Controls)
            {
                control.Clear(); 
// Control不存在Clear方法,编译报错
            }

   但是有了动态代理之后,我们就可以为这些控件定义一个New Face:

     public   interface  INewFace
    {
        
void  Clear();
    }

   然后优雅地这样调用:

        foreach  (Control control  in   this .groupBox1.Controls)
        {
            INewFace face 
=  DynamicTypeEmitter.CreateDynamicProxy < INewFace > (control);
            face.Clear();
        }

(3)使用动态代理除了转发调用外,可以为之注入预处理和后处理,这就是AOP的功能。Spring.NET的AOP实现即是通过动态代理做到的。

  你可以继续挖掘使用动态代理的其它场合,发挥你的想象力,来展现动态代理的威力。  

   ESBasic.dll可以从 当泛型的参数类型是动态的... 的文末下载。











目录
相关文章
|
6月前
|
Java 程序员
动态代理
动态代理
23 0
|
3天前
|
设计模式 缓存 监控
静态代理与动态代理
静态代理与动态代理
10 0
|
2月前
|
设计模式 Java
动态代理详解
【2月更文挑战第7天】
动态代理详解
|
9月前
|
Java
jdk动态代理和cglb动态代理
jdk动态代理和cglb动态代理
|
11月前
|
Java Spring
jdk动态代理和cglib动态代理
只有聪明人才能看见的简介~( ̄▽ ̄~)~
49 0
jdk动态代理和cglib动态代理
|
存储 Java Apache
一文理解动态代理和静态代理
一文理解动态代理和静态代理
170 0
一文理解动态代理和静态代理
|
Java 编译器 Maven
动态代理竟然如此简单!(二)
这篇文章我们来聊一下 Java 中的动态代理。 动态代理在 Java 中有着广泛的应用,比如 AOP 的实现原理、RPC远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理等。
78 0
动态代理竟然如此简单!(二)
|
设计模式 Java 程序员
动态代理竟然如此简单!(一)
这篇文章我们来聊一下 Java 中的动态代理。 动态代理在 Java 中有着广泛的应用,比如 AOP 的实现原理、RPC远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理等。
120 0
动态代理竟然如此简单!(一)
深入理解动态代理
代理模式是在不修改原有代码逻辑的情况下,对原有代码逻辑增强的一种方式,要了解什么是动态代理,首先要知道什么是静态代理。
深入理解动态代理
|
Java Spring
静态代理与JDK动态代理与CGLIB动态代理(上)
静态代理与JDK动态代理与CGLIB动态代理(上)