我想问一下,AspectJ是否可以覆盖超类中的方法,并在方法体中通过super
关键字调用超类的方法。例如,请考虑以下过度简化的方案:
超类:
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();
}
}
子类:
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");
}
}
简而言之,在类Child
中,我正在创建一个方法来覆盖类Parent
中的方法,我希望新方法在超类中调用重写方法。
当我运行时,我收到错误:
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来实现。
答案 0 :(得分:0)
因为在评论中发布代码或命令行输入/输出有点困难,所以我写这个作为答案。想象一下,你有子文件夹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
它还使用手动安装的AJDT编译我的标准Eclipse Oxygen.2(4.7.2)。不了解STS,我从不使用它。