首页 > 解决方案 > 如何使用 javaassist 或任何其他 api 获取所有方法的正确行号?

问题描述

我无法获得正确的方法。很少得到适当的少数不是。

for (CtMethod declaredMethod : declaredMethods) {
        int methodLineNumber = declaredMethod.getMethodInfo().getLineNumber(0);
}

1)什么是错误?
2) 在getLineNumber(int offset)中如何计算偏移量?

标签: javamethodsbytecodeline-numbersjava-assist

解决方案


如果我正确理解了您的问题,您正在寻找您的 java 代码中所有方法的相关起始行号

我建议您使用 JavaParser ( https://javaparser.org/ )

Github 链接 - https://github.com/javaparser/javaparser

它是一个 java 代码分析工具,我也使用它解决了类似问题

您可能需要覆盖 VoidVisitorAdapter 中的访问方法

private static class MethodStartLine extends VoidVisitorAdapter {
    @Override
    public void visit(MethodDeclaration md, Object arg) {

        System.out.println("METHOD: " + md.getDeclarationAsString() + "STARTS AT" + md.getRange().get().begin.line);

    }
}

您需要设置一个编译单元并将其传递给您的驱动程序代码,如下所示

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

如果您需要在多个文件上运行,可以使用 Files.walk() 来制作此处的 File src

File mySrc = new File(srcRoot, filePath)

其中 filePath 是您需要运行 java 解析器的文件的路径,可以使用

getMethodStartLineNumbers(File mySrc)

PS:他们网站上的电子书为您提供了 Java Parsers 的精彩介绍


推荐阅读