【问题标题】:Identify a method and it's scope while reading a source code with a file reader?在使用文件阅读器读取源代码时确定方法及其范围?
【发布时间】:2017-06-03 07:42:50
【问题描述】:

我正在尝试在源代码中搜索特定字符串,以便我可以识别该字符串是在哪个方法中找到的。我尝试了文件阅读器。但失败了。使用文件阅读器读取源代码时如何识别方法及其范围?有没有其他方法可以获取方法及其范围/方法及其声明?

我采取了另一种方法,我可以设法使用类加载器获取文件方法的名称。但再次未能获得方法声明。

任何帮助将不胜感激。 TIA。

【问题讨论】:

  • 你的目标是声明方法吗?即名称、参数、返回类型?
  • 没有。我的目标是逐行阅读方法并搜索特定关键字。如果我使用文件阅读器,这是一个简单的过程。但问题是使用文件阅读器甚至无法识别哪个是方法,哪个是变量等。
  • 您能描述一下您想要实现的功能吗?你的输入和输出是什么?
  • 我有一个源代码。我想在类文件中搜索关键字。我正在尝试查找找到关键字的方法。所以,我要实现的是找到关键字的方法的名称。
  • 唯一正确和可靠的方法是使用 Java 源代码解析器。所有其他解决方案都会因某些输入而失败。

标签: java methods classloader method-declaration


【解决方案1】:

更新版本

很抱歉发布第二个答案,但我只是想确定您是否收到有关此答案的通知。

这是文件的代码:

File file = new File("FilePath");
FileReader fr = new FileReader(file);

BufferedReader br = new BufferedReader(fr);
String t = "";

while((t = br.readLine()) != null)
{
    str = str + t + "\n";
}

这是正则表达式:

Pattern p = Pattern.compile(".*\\s+(.+\\(.*?\\))\\s*\\{(.*"+keyword+"[^\\w*].*)\\}.*\\}$", Pattern.DOTALL);
Matcher m = p.matcher(str);
boolean notFound = true;
while(m.find())
{
    System.out.println("Scope of keyword: " + m.group(1));
    notFound = false;
}

if(notFound)
{
    System.out.println("NOT FOUND");
}

由于您想要关键字的范围,它是声明它的最近的大括号,所以我假设您已经在keyword 中写入了它的数据类型和变量名。稍后我会看看我是否可以处理更多异常:)

.*\\s+ - 接受所有内容,直到方法名

(.+\\(.*?\\))\\s*\\{ - 存储方法名和参数(以防有重载方法)

(.*"+keyword+" - 查找关键字是否出现在其他代码之后

[^\\w*] 保证关键字自身存在(否则如果关键字是double x,并且存在double xy,则匹配)

.*)\\}.*\\}$ - 查看找到关键字后是否有两个大括号(一个用于结束方法或块[在 if、else if、switch 等情况下],一个用于结束类)

【讨论】:

  • 匹配器 m = p.matcher(s);这里的“是”是什么?线法还是总法?
  • 's' 是包含文件全部内容的字符串。我再次更新它以使其更清晰。
【解决方案2】:

在解析源文件时,首先需要知道确定何时到达方法定义(使用一些模式/正则表达式)。然后,一旦您进入某个方法,您应该将其名称保存为当前方法

现在您继续解析关键字。如果您发现您的关键字 ==> 已完成,并且您知道找到它的方法是什么。

您想知道何时退出当前方法。使用堆栈数据结构,以便根据花括号顺序知道何时离开此方法(如果您不熟悉“平衡括号问题”和堆栈,请阅读它们。Example here):

  • { - 表示你将它推入堆栈。
  • } - 表示您从堆栈中弹出一个{(如果它不为空)。如果你解析 } 并且它是空的 - 你做错了什么。

每次堆栈为空时(不要推动类的大括号),这意味着你在方法之间,在外面。在您到达的每种方法中,您都重复相同的算法。

注意事项:

  • 此关键字可能会出现多个,也可能是字符串的一部分。
  • 不要忘记类本身有大括号。
  • 您的源代码可能比“经典”Java 类(子类、内部类等)“更奇怪”。想想您可能拥有的所有不同语言元素。
  • 大括号也可能作为字符串的一部分出现。您应该知道如何避免这些。

祝你好运!

【讨论】:

    【解决方案3】:

    编辑:我在另一个答案中发布了我的源代码。这些只是一些可以未经检查的技术错误。但现在这并不重要。

    识别关键字所在方法的问题是:

    1) 它可能在构造函数中,

    2) 它可能是一个成员变量,

    3) 它可能处于循环或条件中,

    4) 或者它甚至可能在最初执行的方法的 Overriden 方法中。

    最简单的方法是打印位置(如地址)。示例:

    Location: if(a!=0), if(a < 500), main(String[] args), class FUBAR

    您可以使用带有正则表达式的递归方法来识别大括号内的所有内容并搜索关键字。如果可以的话,我可以在 4-5 小时内发布整个代码。

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多