結論
JavaParserを利用して、javaファイルをパースした際に、メソッド宣言された行の行番号を取得するには、MethodDeclarationクラスのgetBeginメソッドを利用します。
ここで注意すべきは、getBeginで取得できる行番号はメソッドアノテーションを含むということです。たとえば、以下のようなメソッド宣言がある場合、getBeginで取得できる行番号はmethodXが記載されている行ではなく、@Override
が記載されている行になります。
@Override
public void methodX(){...}
例
以下のようなファイルがあるとします。
XXX.java
package path.to.example;
public class XXX {
public void methodA() {
// ...
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Override
@SuppressWarnings("all")
public String toString() {
return super.toString();
}
}
このファイルをJavaParserを使ってパースし、XXXクラスのメソッド名とメソッド宣言されている行の行番号をコンソール表示します。
Solution.java
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Paths;
import com.github.javaparser.Position;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
public class Solution {
public static void main(String[] args) {
try {
CompilationUnit compilationUnit = StaticJavaParser.parse(Paths.get("XXX.java"));
MethodDeclarationVisitor methodDeclarationVisitor = new MethodDeclarationVisitor();
compilationUnit.accept(methodDeclarationVisitor, null);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
private static class MethodDeclarationVisitor extends VoidVisitorAdapter<Void> {
@Override
public void visit(MethodDeclaration n, Void arg) {
Position position = n.getBegin().get();
String text = "name=%s, line=%d".formatted(n.getName(), position.line);
System.out.println(text);
super.visit(n, arg);
}
}
}
実行結果は以下の通りになります。
name=methodA, line=4
name=equals, line=8
name=toString, line=13
環境情報 (pom.xmlの抜粋)
pom.xml
<properties>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>3.25.6</version>
</dependency>
</dependencies>