java - 如何在 Java 源文件中获取给定行号的周围方法

标签 java parsing

我有一个 Java 源文件的行号,想以编程方式获取该行号的周围方法。

最佳答案

使用像 JavaParser 这样的东西.据我所见,Node类具有对开始和结束列和行索引的引用。 MethodDeclaration是 Node 的子类,因此解析源文件并搜索“包含”您的行号的 MethodDeclaration。

示例代码

您需要确保 src 文件指向您自己的源。在这里,我只使用样本本身的来源。

package grimbo.test;

import japa.parser.JavaParser;
import japa.parser.ParseException;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.body.MethodDeclaration;
import japa.parser.ast.visitor.VoidVisitorAdapter;

import java.io.File;
import java.io.IOException;

public class TestMethodLineNumber {
    public static void method1() {
        int i = 1;
        System.out.println(i);
    }

    public static void method2() {
        String s = "hello";
        System.out.println(s);
    }

    public static void main(String[] args) throws ParseException, IOException {
        File f = new File(".").getAbsoluteFile();
        File srcRoot = new File(f, "src/main/java");
        String srcFilename = TestMethodLineNumber.class.getName().replaceAll("\\.", "/") + ".java";
        File src = new File(srcRoot, srcFilename);
        System.out.println(f);
        System.out.println(srcRoot);
        System.out.println(src);
        getMethodLineNumbers(src);
    }

    private static void getMethodLineNumbers(File src) throws ParseException, IOException {
        CompilationUnit cu = JavaParser.parse(src);
        new MethodVisitor().visit(cu, null);
    }

    /**
     * Simple visitor implementation for visiting MethodDeclaration nodes.
     */
    private static class MethodVisitor extends VoidVisitorAdapter {
        @Override
        public void visit(MethodDeclaration m, Object arg) {
            System.out.println("From [" + m.getBeginLine() + "," + m.getBeginColumn() + "] to [" + m.getEndLine() + ","
                    + m.getEndColumn() + "] is method:");
            System.out.println(m);
        }
    }
}

示例输出

From [13,5] to [16,5] is method:
public static void method1() {
    int i = 1;
    System.out.println(i);
}
From [18,5] to [21,5] is method:
public static void method2() {
    String s = "hello";
    System.out.println(s);
}
From [23,5] to [32,5] is method:
public static void main(String[] args) throws ParseException, IOException {
    File f = new File(".").getAbsoluteFile();
    File srcRoot = new File(f, "src/main/java");
    String srcFilename = TestMethodLineNumber.class.getName().replaceAll("\\.", "/") + ".java";
    File src = new File(srcRoot, srcFilename);
    System.out.println(f);
    System.out.println(srcRoot);
    System.out.println(src);
    getMethodLineNumbers(src);
}
From [34,5] to [37,5] is method:
private static void getMethodLineNumbers(File src) throws ParseException, IOException {
    CompilationUnit cu = JavaParser.parse(src);
    new MethodVisitor().visit(cu, null);
}
From [43,9] to [48,9] is method:
@Override
public void visit(MethodDeclaration m, Object arg) {
    System.out.println("From [" + m.getBeginLine() + "," + m.getBeginColumn() + "] to [" + m.getEndLine() + "," + m.getEndColumn() + "] is method:");
    System.out.println(m);
}

关于java - 如何在 Java 源文件中获取给定行号的周围方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7360311/

相关文章:

java - WebCollector 无法解析查询 Java

parsing - 是什么让 libadalang 与众不同?

java - JSONObject 类型的方法 getJSONObject(String) 未定义

java - JAX-RPC 和 Axis2 是否受到 XML 注入(inject)保护?

Java switch case - 默认与显式枚举

java - Java 中的 NOAA XML 解析 - 获取纬度和经度元素

c++ - 从字符串中提取子字符串 C++

c# - 如何从 UWP 中的 Assets 文件夹中解析 JSON 文件 - 已关闭

java - 如何通过日历 URL 在 Java 程序中使用 iCal 日历?

java - connectionmanager 真的应该关闭吗?