【问题标题】:How to get correct line number of all methods using javaassist or any other api?如何使用 javaassist 或任何其他 api 获取所有方法的正确行号?
【发布时间】:2020-04-21 12:39:43
【问题描述】:

我无法获得正确的方法行。很少有正确的很少。

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

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

【问题讨论】:

  • 你想得到什么行号?一个方法通常跨越多行。您是否试图获取方法标题所在的行?
  • 是的,方法声明或方法的开始。
  • 此信息不可用。只有可执行代码与调试信息中的行号相关联。因此,您只能获取方法的第一行,从而生成可执行代码。对于抽象和本机方法,根本没有可用的行号。

标签: java methods bytecode line-numbers java-assist


【解决方案1】:

如果我正确理解了您的问题,您正在寻找您的 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 的精彩介绍

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2012-07-31
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多