AspectJ:完成对象初始化后的切入点

时间:2014-01-05 16:14:45

标签: java aop aspectj

我想在初始化完成后为一组类(在我的情况下,从特定包中)创建的每个对象添加一个建议。请考虑以下代码:

public class Test {
    public static void main(String[] args) {
        new A();
        new A(0);
        new B();
        new B(0);
        new B(false);
    }
}

class A {
    public A() {
    }

    public A(int i) {
        this();
    }
}

class B extends A {
    public B() {
    }

    public B(int i) {
        this();
    }

    public B(boolean b) {
        super(0);
    }
}

例如,对于new B(false),建议应该在public B(boolean)之后运行,而不是在public A(int)之后的public A()之后运行。另请注意,我不想在main()中建议构造函数调用;如果对象是由第三方应用程序构造的,而第三方应用程序不是用我的方面编译的,那么建议应该仍然存在,即应该建议构造函数本身。

我认为这应该可以使用一些!cflowbelow()表达式,但我没有运气。我得到的最接近的是:

after() : initialization(pkg.*.new(..))
        && !cflowbelow(withincode(pkg.*.new(..)))
        && !within(MyAspect) {
    System.out.println(thisJoinPointStaticPart);
}

给出了这个输出:

initialization(test.A())

initialization(test.A(int))

initialization(test.A())
initialization(test.B())

initialization(test.A())
initialization(test.B(int))

initialization(test.A(int))
initialization(test.B(boolean))

即。 this()执行被正确忽略,但super()执行却没有。此外,我担心这会忽略public B() {new A();}或类似内容,因为new A();位于pkg.*.new(..) cflowbelow ...

我无法想象这不是一个一遍又一遍有用的用例,但我没有找到任何资源。需要完全初始化的示例是在记录新创建的对象时,但toString()方法使用对象的状态。除了“子类最多”构造函数之外的任何其他建议将在包含未初始化值的日志中产生,并且建议构造函数调用将如我所说的那样不能与第三方代码(或者我的示例中来自不同包的代码)一起工作。 p>

对于额外的互联网cookie,我如何选择最底层(非对象或其他非未经修改的超类)构造函数来注入预初始化代码?

0 个答案:

没有答案