我目前正在开发一个项目,而且我需要从给定的Java源代码中提取所有方法。我需要在 antlr v3 中实现它,但我来到了一个死胡同,因为api文档没有说明如何做到这一点。我也搜索了官方书籍,但仍然没有成功。有什么想法吗?
编辑: 我发现在 antlr v4 中可以这样做:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
ANTLRInputStream input = new ANTLRInputStream(System.in);
JavaLexer lexer = new JavaLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
ParseTree tree = parser.compilationUnit();
ParseTreeWalker walker = new ParseTreeWalker();
MethodPrinter printer = new MethodPrinter();
walker.walk(printer, tree);
for (String method : printer.methods)
System.out.println(method);
}
}
其中Method printer
的实现方式如下:
import org.antlr.v4.runtime.tree.TerminalNode;
import java.util.ArrayList;
public class MethodPrinter extends JavaBaseListener {
boolean inMethod;
String currentMethod;
ArrayList<String> methods;
public MethodPrinter() {
inMethod = false;
methods = new ArrayList<String>();
}
public void enterMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
inMethod = true;
currentMethod = "";
}
public void exitMethodDeclaration(JavaParser.MethodDeclarationContext ctx) {
inMethod = false;
methods.add(currentMethod);
}
public void visitTerminal(TerminalNode node) {
if (inMethod)
currentMethod += node.getText() + " ";
}
}
如何在 antlr v3 中实现此功能?
答案 0 :(得分:0)
Java源代码必须封装在一个类中 您可以使用反射来获取给定类中的所有方法。
...
Class cl = Class.forName("com.example.test.MyClass");
// or cl = someObject.getClass();
List<Method> methods = cl.getDeclaredMethods(cl);
methods.addAll(cl.getMethods());
...
然后你可以使用普通的java列表