0

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

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

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

4

3 回答 3

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 等情况下],一个用于结束类)

于 2017-06-03T15:45:36.483 回答
0

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

现在您继续解析您的关键字。如果你找到了你的关键字 ==> done,并且你知道它是在什么方法中找到的。

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

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

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

有几点需要注意:

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

祝你好运!

于 2017-06-03T08:40:39.120 回答
0

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

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

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

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

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

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

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

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

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

于 2017-06-03T08:08:34.643 回答