【问题标题】:Java - Get position in code (Package/Class/Method)Java - 获取代码中的位置(包/类/方法)
【发布时间】:2011-02-02 09:39:39
【问题描述】:

好吧,可能是个愚蠢的问题。 我正在做一个 java 项目,我希望能够轻松获取当前代码的位置,即 Package/Class/Method,并将其打印到输出。

例如,我想在错误的情况下输出Package/Class/Method信息,以便能够识别错误发生的确切方法。

有没有代码可以给我这个信息?

【问题讨论】:

    标签: java error-handling


    【解决方案1】:

    stacktraceJVM 提供,它包含所有这些信息,只需记录即可。

    或者编程方式如果你想确定

    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()
    

    根据Javadocs

    [...] 数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。

    StackTraceElement 有getClassName()getFileName()getLineNumber()getMethodName()

    【讨论】:

    • 好吧,最近的方法可能是 main 或类似的方法。 OP 可能想要相反的结果:最新的。
    • @martinho stackTraceElements 包含所有信息
    • @org.life.java:问题是您不知道该数组中的“当前方法”在哪里。最新的(索引 0)可能是 getStackTrace 或那里调用的东西。当然不能保证介于两者之间的任何事情。打印出整个堆栈会有所帮助,但您不能依赖它来学习当前的方法。
    • @Mart oth 将是 getStacktrace 并且需要 1 Thread.currentThread().getStackTrace()[1].getMethodName()
    • @org.life.java:不,[1] 不是所需的位置。如果您在 Sun 的 JVM 1.5 上运行,它恰好在位置 [2]。在其他 JVM 或其他版本上,它可以是 [1]、[2]、[3],等等。甚至 [0] 也是可能的,因为允许 JVM 省略堆栈帧。您没有保证
    【解决方案2】:

    出现错误时创建异常。如果要将其打印到控制台,则可以在异常上调用exception.printstacktrace(); 方法。

    最好使用 log4j 之类的日志框架,您可以使用logger.error( "message", exception );,您将在日志中获得堆栈跟踪。

    【讨论】:

      【解决方案3】:

      不要寻求如此复杂的解决方案。

      如果您使用的是 log4j,那么您已经完成了。 使用这样的模式:%-5p %d [%t] %C{1}.%M(%L): %m%n

      %t 是当前线程 %C{1} 是类的名称(省略 {1},您将获得带有包的完整限定名称) %M 是方法的名称 %L 是行号 详情请查看:http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

      请记住,登录方法的名称或行号会降低性能。 永远不要在生产系统中这样做。

      【讨论】:

      • +1 用于使用日志系统的功能,而不是自己动手
      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2014-04-26
      • 2011-02-06
      • 2018-11-19
      相关资源
      最近更新 更多