【问题标题】:Get the package of a Java source file获取一个Java源文件的包
【发布时间】:2011-02-20 09:01:48
【问题描述】:

我的目标是找到 Java 源文件的包(作为字符串),以纯文本形式给出并且尚未在文件夹中排序。

我不能只在文件中找到关键字package 的第一个实例,因为它可能出现在注释中。所以我在考虑两种选择:

  • 逐字扫描文件,为扫描仪维护一个“inside-a-comment”标志。第一次遇到不在评论中的package 关键字时,停止扫描并报告结果。
  • 使用正则表达式 - 理论上应该是可行的,因为块 cmets 在 Java 中没有下一步,但我尝试制作这样的正则表达式,结果证明它相当复杂 - 至少对我来说是这样。

这两种方法的另一个区别是,手动扫描时,当我可以确定package 关键字不再出现时,我可以停止扫描,从而节省一些时间......我不确定我能做些什么与正则表达式类似。另一方面,“何时不再出现”的决定is not necessarily simple,尽管我可以为此使用一些启发式方法。

我想听听有关此问题的任何意见,并欢迎任何有关正则表达式的帮助。我的解决方案也是用 Java 编写的。

编辑: 对于那些建议实际解析文件的人 - 这绝对是一个可行的选择,谢谢,但我觉得只为包解析整个文件有点矫枉过正。如果没有更简单的选择,我会这样做。

【问题讨论】:

  • 包声明(例如,package graphics;)必须是源文件的第一行。 (java.sun.com/docs/books/tutorial/java/package/createpkgs.html) 所以你要么在评论中,要么在空白或包装声明中(如果存在)。希望这会有所帮助。
  • @Anton:其实注解可能会先出现,可能有很多,如果我没记错的话,它们里面还可以包含表达式:(

标签: java regex parsing


【解决方案1】:

我通过使用 java 解析器解决了这个问题。就我而言,javaparser 是最合适的。

CompilationUnit cu = JavaParser.parse( file );
String packageName = cu.getPackage().getName().toString();

【讨论】:

    【解决方案2】:

    您可以使用实际的 java 源代码解析器,例如 javaparser。它提供了正确解析的 java 文件,而无需重新发明 java 解析器或使用穷人的解析器(正则表达式)。

    我看到的唯一缺点是,您可能希望在找到包后立即停止解析,并避免解析文件的其余部分。有多种方法可以实现这一点,但我建议您在考虑这一点之前先测量整个文件的性能。

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多