0

我需要对 java 解析器生成的 AST 做一些操作。我的问题是我想检查一个类初始化周期问题是否存在。

一个例子是,

class mark1 {
  public static final int x = mark2.p * 5;
  //Do some operations here
} 

class mark2 {
 public static final int p = mark1.x + 100;
 //Do some operations here
}

类的初始化顺序可能会有所不同,从而导致计算 mark1.x 和 mark2.p 的不同值。我正在尝试使用 javaparser 生成的 AST 来实现它,但没有得到可行的解决方案。

4

1 回答 1

0

使用 JavaParser,您可以轻松获取所有静态字段和静态初始化程序。

我看到的问题是您需要解决引用问题。例如,您需要了解“mark2.p”和“mark1.x”指的是其他类的静态字段。从 AST 的角度来看,它们是字段访问,但单独的 AST 和 JavaParser 无法告诉您该特定字段是静态的。为此,您需要使用像https://github.com/ftomassetti/java-symbol-solver/这样的符号求解器,或者您可以自己构建逻辑。例如,您可能需要查看导入并查看是否已导入类 mark1,或者是否有一个名为 mark1 的类与 mark2 存在于同一包中。这样做你可以识别出 mark1 是一个类的名称,并在该类中查找符号 p。然后您可以找到它并注意到它是一个静态字段。

来源:我是 JavaParser 贡献者

于 2016-04-25T14:08:05.590 回答