java - 如何获取方法的行号?

标签 java reflection

是否可以使用反射或其他魔法获取方法的行号?
如果该方法在当前 Stacktrace 中,则有可能。使用 Thread.currentThread().getStackTrace(),可以获取 StackTraceElement 的行号.但是如果我只得到 java.lang.reflect.Method 怎么办?对象?

我发现这个,对于类-> How to get source file-name/line-number from a java.lang.Class object但它对方法没有用。

最佳答案

我想做同样的事情,经过一些研究后选择了 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");
    }
}

输出:方法 x 在第 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>

关于java - 如何获取方法的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12834887/

相关文章:

Java Arrays.sort 将结果重置为零

java - 我可以使用 GWT HTTP 请求从网站读取文本文件吗?

java - 如何在 Codenameone 中使用 cloudinary 缓存不同名称的图像

c# - 返回类中的所有字段

java - 如何杀死Java进程的子进程?

java - JSF/Primefaces - 命令按钮 : open new browser tab without ViewScoped bean getting killed

c# - 从基类实例化派生类的通用工厂方法

c# - 如何将 C# Select () 扩展委托(delegate)或表达式传递给存储库?

dynamic - 在 Swift 中,如何使用 setValueForKey 设置对象的 textAlignment 属性?

使用引用类型和可空值类型的 C# 泛型类