在进行了一些研究之后,我想做同样的事情。您将需要添加javassist(我使用的是3.15.0-GA版本)。
给定以下类,确定“ x”方法的位置。方法名称“
x”是硬编码的,但是如果您和我在同一条船上,则反射并不难,因此我相信您可以获得方法名称的列表,然后下面的内容将使您获得行号方法:
public class Widget { void x(){System.out.println("I'm xn");} //comment added to create space void y(){System.out.println("I'm yn");} }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 javassistn"); 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>



