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