Java 确定一种方法及其应用';使用文件读取器读取源代码时的范围?

Java 确定一种方法及其应用';使用文件读取器读取源代码时的范围?,java,methods,classloader,method-declaration,Java,Methods,Classloader,Method Declaration,我试图在源代码中搜索一个特定的字符串,以便识别该字符串是在哪个方法中找到的。我尝试了文件读取器。但失败了。在使用文件读取器读取源代码时,如何识别方法及其作用域?有没有其他方法来获取方法及其作用域/方法和声明 我采用了另一种方法,在这种方法中,我可以使用classloader获得文件的方法名。但再次未能获取方法声明 任何帮助都将不胜感激。TIA.编辑:我已经在另一个答案中发布了我的源代码。这些只是一些可以不检查的技术错误。但现在这并不重要。 识别关键字所在方法的问题是: 1) 它可能在构造函数中

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

我采用了另一种方法,在这种方法中,我可以使用classloader获得文件的方法名。但再次未能获取方法声明


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

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

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

1) 它可能在构造函数中

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

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

4) 或者它甚至可能位于最初执行的方法的重写方法中

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

位置:if(a!=0)、if(a<500)、main(String[]args)、class FUBAR


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

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

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

您可能想知道何时退出当前方法。根据花括号顺序,使用堆栈数据结构以了解何时离开此方法(如果不熟悉,请阅读“平衡括号问题”和关于堆栈的内容):

  • {
    -表示将其推送到堆栈中
  • }
    -表示您从堆栈中弹出一个
    {
    (如果它不是空的)。如果您解析
    }
    并且它是空的,则表示您做错了什么
每当堆栈为空时(不要推类的花括号),这意味着您处于方法之间,在外部。在你使用的每一种方法中,你都会重复同样的算法

需要注意的几件事:

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

祝你好运

更新版本

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

这是文件的代码:

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");
}
因为您需要关键字的作用域,所以它是声明它的最接近的大括号,所以我假设您已经在
关键字中写入了它的数据类型和变量名。稍后我将查看是否可以处理更多异常:)

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

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

(.*+keyword+”
-查找关键字是否位于其他代码之后

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


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

您的目标是要进行方法声明吗?i、 名称、参数、返回类型?否。我的目标是逐行读取方法并搜索特定关键字。如果我使用文件阅读器,这是一个简单的过程。但问题是,使用文件读取器甚至无法识别哪一个是方法,哪一个是变量等。你能描述一下你试图实现的函数吗?你的输入和输出是什么?我有一个源代码。我想在类文件中搜索关键字。我试图找到关键字是在哪个方法中找到的。因此,我想要实现的是找到关键字的方法的名称。唯一正确和可靠的方法是使用Java源代码解析器。所有其他解决方案都会因某些输入而失败。Matcher m=p.Matcher(s);这是什么?line或total方法?'s'是包含文件全部内容的字符串。我再次更新了它,使其更加清晰。