私は同じことをしたかったので、いくつかの調査の後、javassist に落ち着きました。javassist を追加する必要があります (私はバージョン 3.15.0-GA を使用しました)。
次のクラスを指定して、「x」メソッドの場所を決定します。メソッド名「x」はハードコーディングされていますが、私と同じボートに乗っている場合、リフレクションは難しくないので、メソッド名のリストを取得できると確信しています。次のようにして行番号を取得できますメソッドの:
public class Widget {
void x(){System.out.println("I'm x\n");}
//comment added to create space
void y(){System.out.println("I'm y\n");}
}
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class App {
public static void main(String[] args) throws NotFoundException {
System.out.println("Get method line number with javassist\n");
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.quaternion.demo.Widget");
CtMethod methodX = cc.getDeclaredMethod("x");
int xlineNumber = methodX.getMethodInfo().getLineNumber(0);
System.out.println("method x is on line " + xlineNumber + "\n");
}
}
出力:method x is on line 12
私の場合は正確ですが、いくつかのコメントを切り取りました...
注: コメントで Pete83 が述べたように、このメソッドは実際には、メソッドを宣言する行ではなく、メソッドのコードの最初の行を返します。ほとんどの場合、相対位置 (宣言された順序) を確立し、この情報を独自の規則に使用する必要があるため、これは通常問題にはなりません。これは、コード自体内の位置によって容易に決定できる序数値を注釈内に含める必要があると感じたときにいつでも発生します。
javassist のクイック リファレンス Maven 座標:
<dependency>
<groupId>org.javassist</groupId> <!-- if a version prior to 3.13.0-GA is needed use "javassist" and not "org.javassist" -->
<artifactId>javassist</artifactId>
<version>3.15.0-GA</version>
</dependency>