AspectJ:重写一个方法,通过`super`调用被重写的方法
AspectJ: Override a method and call the overridden method through `super`
我想问一下是否可以使用 AspectJ 覆盖 superclass 的方法,并在方法体中通过 [= 调用 superclass 的方法14=] 关键字。例如,考虑以下过于简化的场景:
超级class:
package test;
public class Parent {
public void doSomething() {
System.out.println("Parent is doing something");
}
public static void main(String[] args) {
Parent instance = new Child();
instance.doSomething();
}
}
子class:
package test;
public class Child extends Parent {
}
看点:
package test;
public aspect MyAspect {
public void Child.doSomething() {
super.doSomething();
System.out.println("Child is doing something");
}
}
简而言之,在 class Child
中,我正在创建一个覆盖 class Parent
方法的方法,我希望新方法调用superclass.
中的重写方法
当我运行这个时,我得到一个错误:
Exception in thread "main" java.lang.NoSuchMethodError: test.Child.ajc$superDispatch$test_Child$doSomething()V
at test.MyAspect.ajc$interMethod$test_MyAspect$test_Child$doSomething(MyAspect.aj:6)
at test.Child.doSomething(Child.java:1)
at test.Parent.main(Parent.java:11)
我知道我可以通过字节码检测库实现这一点,但是我现在正在处理的项目使用 AspectJ,我必须通过 AspectJ 来实现。
因为在评论中 post 代码或命令行 in-/output 有点困难,所以我写这个作为答案。假设您在子文件夹 src
中有源文件,并且希望编译后的输出以 bin
结束(标准 Eclipse 目录布局),您可以这样做:
xx> java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
xx> ajc -sourceroots src -d bin -cp "C:\Program Files\Java\AspectJ\lib\aspectjrt.jar"
xx> java -cp bin;"C:\Program Files\Java\AspectJ\lib\aspectjrt.jar" test.Parent
Parent is doing something
Child is doing something
它还在我的标准 Eclipse Oxygen.2 (4.7.2) 中编译,并手动安装了 AJDT。不知道STS,没用过
我想问一下是否可以使用 AspectJ 覆盖 superclass 的方法,并在方法体中通过 [= 调用 superclass 的方法14=] 关键字。例如,考虑以下过于简化的场景:
超级class:
package test;
public class Parent {
public void doSomething() {
System.out.println("Parent is doing something");
}
public static void main(String[] args) {
Parent instance = new Child();
instance.doSomething();
}
}
子class:
package test;
public class Child extends Parent {
}
看点:
package test;
public aspect MyAspect {
public void Child.doSomething() {
super.doSomething();
System.out.println("Child is doing something");
}
}
简而言之,在 class Child
中,我正在创建一个覆盖 class Parent
方法的方法,我希望新方法调用superclass.
当我运行这个时,我得到一个错误:
Exception in thread "main" java.lang.NoSuchMethodError: test.Child.ajc$superDispatch$test_Child$doSomething()V
at test.MyAspect.ajc$interMethod$test_MyAspect$test_Child$doSomething(MyAspect.aj:6)
at test.Child.doSomething(Child.java:1)
at test.Parent.main(Parent.java:11)
我知道我可以通过字节码检测库实现这一点,但是我现在正在处理的项目使用 AspectJ,我必须通过 AspectJ 来实现。
因为在评论中 post 代码或命令行 in-/output 有点困难,所以我写这个作为答案。假设您在子文件夹 src
中有源文件,并且希望编译后的输出以 bin
结束(标准 Eclipse 目录布局),您可以这样做:
xx> java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
xx> ajc -sourceroots src -d bin -cp "C:\Program Files\Java\AspectJ\lib\aspectjrt.jar"
xx> java -cp bin;"C:\Program Files\Java\AspectJ\lib\aspectjrt.jar" test.Parent
Parent is doing something
Child is doing something
它还在我的标准 Eclipse Oxygen.2 (4.7.2) 中编译,并手动安装了 AJDT。不知道STS,没用过