2. 如何拦截构造方法
AOP最重要的特性就是对方法的拦截,这其中也包括构造方法。所谓拦截,就是在执行原方法时,要在两个位置来执行我们织入的代码,如日志代码。这两个位置是before(在原代码执行之前)和after(在原代码执行之后)。当然,还可以对源代码进行around(完全取代原来的代码)。这对于普通的方法来说并不算什么,如上面的Method1方法。要想在ProxyClass类中的Method1方法拦截Class1类中的方法,before、after和around的实现分别如下:
但这对于构造方法来说却无法实现。因此,在子类中调用父类中的构造方法只能在方法后面调用,如下面代码所示:before: public override void Method1() ...{ base.Method1(); ... } after: public override void Method1() ...{ ... base.Method1(); } around: public override void Method1() ...{ ... ...}
从上面的代码可以看出,构造方法只能实现before,而不能实现after和around。也就是在子类中无论写不写base关键字,必须调用父类中的构造方法(如果不写,调用父类中无参数的默认构造方法)。更不会有下面的代码形式:public Class2(String s) : base(s) ...{...}
因此,如何使构造方法也拥有after和around特性,就成为实现AOP构架的第二个拦路虎。public Class2(String s) ...{... base(s);}