我目前正在将 AspectJ 应用到我们的项目中,我发现了一种对我来说有点奇怪的行为。
Q1: 我用inter-type声明给我当前的类增加了一个新的构造函数,发现如果用这个新的构造函数来实例化我的类,这个类的成员变量没有被初始化。
例如:
我将向其中添加新构造函数的类:
public class Child {
public String name = "John";
public Child(String desc) {
// TODO Auto-generated constructor stub
}
}
方面J代码:
public aspect MyTest {
public Child.new(String desc, int num) {
System.out.println("Child Name:" + this.name);
}
}
如果我用新的构造函数实例化 Child:
new Child("A child", 5)
成员变量this.name没有像原来的构造函数那样被初始化。
但是,如果我调用原始构造函数:
new Child("A child")
成员变量this.name将像往常一样初始化为“John”
结果:
孩子姓名:空
这是 AspectJ 的限制吗?有没有办法解决这个问题?
我真的不想将成员变量初始化的代码添加到新的构造函数中。
Q2: 似乎在新添加的构造函数中,super.method()无法正确解析。
我将向其中添加新构造函数的类:
public class Child extends Parent{
public String name = "John";
public Child(String desc) {
}
}
Child扩展Parent。父母有一个方法init()
public class Parent {
public void init() {
//....
}
}
我在我的方面为Child添加了一个新的构造函数。
public aspect MyTest {
public Child.new(String desc, int num) {
super.init();
}
}
上面的切面代码会触发异常。
Exception in thread "main" java.lang.NoSuchMethodError: com.test2.Child.ajc$superDispatch$com_test2_Child$init()V
at MyTest.ajc$postInterConstructor$MyTest$com_test2_Child(MyTest.aj:19)
at com.test2.Child.<init>(Child.java:1)
at MainProgram.main(MainProgram.java:11)
我的解决方法是为我的类Child定义另一个方法,并在该方法中间接调用 super.method()
例如,为Child添加一个调用super.init()的新方法
public void Child.initState()
{
super.init();
}
现在,我可以在新添加的构造函数中调用 initState(),如下所示:
public aspect MyTest {
public Child.new(String desc, int num) {
this.initState();
}
}
这是 AspectJ 的限制吗?这是解决此问题的唯一方法吗?
谢谢大家的时间:)