当前位置: 首页 > 面试题库 >

如何获得方法的行号?

秦炜
2023-03-14
问题内容

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

对于类->如何从java.lang.Class对象获取源文件名/行号,我发现了这一点,但是它对方法没有用。


问题答案:

在进行了一些研究之后,我想做同样的事情。您将需要添加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>


 类似资料:
  • 问题内容: 基本上,我有一个拆卸方法,我想登录到刚刚运行测试的控制台。我将如何获取该字符串? 我可以获得类名,但是我想要刚刚执行的实际方法。 …应该输出到屏幕上:“刚运行的测试是:testCase” 但是,我不知道实际上应该具有的魔力。 问题答案: 在@AfterMethod中声明一个ITestResult类型的参数,然后TestNG将其注入:

  • 问题内容: 我有一个很好的功能,可以以给定类型打印有关给定方法的一些信息,这是一个goplay 除了我找不到找到方法参数名称的方法以外,我需要做的所有事情吗? 问题答案: 局部变量的名称(包括函数参数)仅适用于程序员。编译器在生成代码时将其丢弃。无法检索参数名称,因为它们在编译后的代码中不可用。

  • 问题内容: 我已经执行了JDBC查询以获取结果集。在遍历之前,我想快速找出返回了多少行。我如何才能做到这一点? 我正在使用Java 6,Oracle 11g和最新的Oracle JDBC驱动程序。 问题答案: 您将不得不作为一个单独的查询来执行此操作,例如: 某些JDBC驱动程序可能会告诉您,但这是可选行为,更重要的是,该驱动程序可能还不知道。这可能是由于如何优化查询所致,例如,Oracle中的两

  • 问题内容: 如何从SELECT语句的上一个结果行中获取值 如果我们有一个名为cardevent的表,并且有[ID(int),Value(Money)]行,并且其中有一些行,例如 很快… 如何进行一个查询,以获取每个行的ID,值和前一个行值,数据在其中显示如下 很快。 那么,有人可以帮助我获得针对此类问题的最佳解决方案吗? 需要查询帮助 问题答案: 您将不得不将表与自身连接,我不确定这是否是100%

  • 问题内容: 您好在我的Java类Toto中,我有3个静态方法,我想知道当我处于这些方法之一时,如何在try catch bloc中获取和显示package.class.methode的名称?我在methodeA中尝试过: 但它不起作用,我怎么也可以尝试显示它?谢谢 问题答案: -将打印整个异常stracktrace-即所有方法+行号。

  • 问题内容: 现在,如果您现在只能访问,您可以参考一下吗? 问题答案: 并以类似的方式为该类: 对于这种代码发现,您应该安装iPython并使用tab,例如,在您的情况下,myReference。+ TAB会给出: 因此,您无需担心太多的事情-您知道该方法可能是由函数对象提供的,并且从iPython给出的建议中可以很明显地看出您正在寻找什么方法/属性。