我想在初始化完成后为一组类(在我的情况下,从特定包中)创建的每个对象添加一个建议。请考虑以下代码:
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,我如何选择最底层(非对象或其他非未经修改的超类)构造函数来注入预初始化代码?