我想做同样的事情,经过一些研究后,我决定使用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>