如何在AspectJ中删除/重新定义类型间声明?

时间:2011-06-07 20:52:01

标签: java declaration aspectj aop

我使用解析器生成器,它生成表示编程语言语法节点的java类,以及AspectJ方面,用于向这些类添加语义。 我已经扩展/更改了语言的语法,我想重用旧语法的各个方面,并修改/扩展它们以应对节点类的更改。

例如,旧节点类及其方面:

class A {
  public T a1;
  public U a2;
  ...
}

aspect Accessors1 {
  public T A.getT() {return a1;}
  public U A.getU() {return a2;}
}

通过语法修改,A类随后会发生变化:

class A {
  public T a1;
  public V a2;
  public U a3;
  ...
}

我想重用Accessors1方面并添加另一个方面:

aspect Accessors2 {
  public V A.getV() {return a2;} // new accessor for new field
  public U A.getU() {return a3;} // modification of old accessor
}

我试过了:

declare precedence: *2, *1;

但我仍然从第一个方面得到此错误:Type mismatch: cannot convert from V to U。即使未使用Accessors1.getU(),它仍然是类型检查的,这会导致编译失败。

为什么会这样?如何用新的覆盖原始getU()?有没有办法告诉AspectJ忽略/删除Accessors1.getU()?

1 个答案:

答案 0 :(得分:0)

如果您尝试在第二课中使用以下更改,该怎么办:

class A {
  public T a1;
  public U a2;
  public V a3;
  ...
}

第二个方面:

aspect Accessors2 {
  public V A.getV() {return a3;} // new accessor for new field
  public U A.getU() {return a2;} // modification of old accessor
}