AspectJ:覆盖一个方法并通过`super`调用重写的方法

时间:2018-03-21 10:49:17

标签: java aspectj super

我想问一下,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来实现。

1 个答案:

答案 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,我从不使用它。