当前位置: 首页 > 知识库问答 >
问题:

Javaparser AST模式匹配

松俊美
2023-03-14

我需要对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实现它,但没有得到可行的解决方案。

共有1个答案

广亮
2023-03-14

使用JavaParser,您可以轻松获得所有静态字段和静态初始值设定项。

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

来源:我是JavaParser的贡献者

 类似资料:
  • 模式,是Rust另一个强大的特性。它可以被用在let和match表达式里面。相信大家应该还记得我们在复合类型中提到的关于在let表达式中解构元组的例子,实际上这就是一个模式。 let tup = (0u8, 1u8); let (x, y) = tup; 而且我们需要知道的是,如果一个模式中出现了和当前作用域中已存在的同名的绑定,那么它会覆盖掉外部的绑定。比如: let x = 1; let c

  • 一、模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同: Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常

  • 主机权限和 内容脚本匹配 是基于匹配模式定义的一组 URL。匹配模式本质上是一个以允许的 schema(http,https,file 或ftp 开头)的URL,并且可以包含 “*” 字符。特殊模式 < all_urls > 匹配以允许的 schema 开头的任何 URL。 每个模式包含 3 个部分: schema - 例如,http 或file 或 * 注意:对文件 URL 的访问不是自动的。用

  • MySQL提供了一个标准的SQL模式匹配,和基于扩展的正则表达式的模式匹配Unix工具(如vi,grep,sed)一样。 SQL模式匹配可以使用“_“来匹配任意单个字符,”%“可以用来匹配任意数量(包含0个字符)的字符。在MySQL中,SQL模式匹配的大小写默认是不敏感的,以下有一些例子,当你在使用SQL模式时,不要使用 = 或 <>,而是使用LIKE 或 NOT LIKE。 要找到以字符“b"开

  • 除了我们常见的控制语句之外,Rust还提供了一个更加强大的关键字——match 。但是,需要指出的一点是,match只是匹配,要发挥其全部威力,还需要模式的配合。本章,我们就将的对Rust的模式匹配进行一番探索。 本章内容: match关键字 模式 pattern

  • 模式匹配 内容脚本可以作用到模式匹配定义好的URL集合上. 你能对manifest文件的内容脚本段的部分进行一个或多个模式匹配操作. 这里描述模式匹配语法 — 当你指定内容脚本将影响哪些URL时你需要遵循的规则. 任意一个模式匹配本质上都是一个以认可的协议(例如:http, https, file, ftp 或者 chrome-extension)开头的URL,只是URL你可以包含"*"字符. 这

  • HTTPS、Websocket需要开启HTTPS拦截才可以正常抓包及使用所有匹配模式,否则只能用域名匹配 有些老版本可能不支持以下的某种匹配模式,遇到这种情况可以升级下whistle即可 whistle的匹配模式(pattern)大体可以分成 域名、路径、正则、精确匹配、通配符匹配: 其中 正则匹配、精确匹配、通配符匹配支持取非,即 !pattern,表示不匹配 pattern 关键字符:^(通配

  • 主要内容:实例,实例,使用样例类,实例Scala 提供了强大的模式匹配机制,应用也非常广泛。 一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。 以下是一个简单的整型值模式匹配实例: 实例 object Test {     def main (args : Array [String ] ) {       println (matchTes