java中的__LINE__等价物?

2022-09-02 09:28:19

我正在寻找一种在输出消息中包含为编译时常量的方法。__LINE__

似乎存在各种解决方案,但正如JS中的__LINE__C#中的__LINE__建议的那样,存在很大的运行时损失。它们通常始终基于运行时对象 log4j。StackFrame

使用log4j根据需要启用/禁用的可能性也不是一种选择,因为通常当发生错误时,启用行号为时已晚,并且内联代码似乎不再有任何行号。.是否有可能:

  1. 在编译之前预处理java源文件,理想情况下是与Eclipse1集成的东西,因此它也可以在developpement平台上进行测试。
  2. 能够在加载时预处理类。然后,通过摊销,间接费用可以忽略不计。

1.实际上我确实使用了一个丑陋的黑客:在构建服务器上结帐后通过ANT技巧调用自定义预处理器


答案 1

在编译时不可能获得C中的效果。__LINE__

您可以通过在运行时调用这样的函数来获取行号,

public static int lineNumber() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
}

答案 2

如果使用该选项进行编译,则行信息存在于类文件中,但 VM 可以在运行时将其丢弃。这取决于您在启动 Java 程序时可以指定的一些选项。通常,使用调试信息运行的性能损失约为5%,加上perm gen空间中的内存增加一点。由于这些信息非常宝贵,我认为没有理由剥离这些信息。debug=line

您的评论 () 表明您正在使用主动优化。如果可以,请将其关闭。这样,您只需:Util.java(Inlined Compiled Code)

// For Java 1.4, use new Exception().getStackTrace()
int line = Thread.currentThread().getStackTrace()[0].getLineNumber();

当您需要它时(即在 或 中)。catchif (log.isInfoEnabled())

至于,Java编译器不支持这个。您唯一的选择是使用一些黑客来过滤源。我建议在某个地方定义一个变量,并在需要时将其设置为某个随机值(0足够随机)。然后编写一个筛选器,将 number 替换为当前行号。这允许将行号固定到位。__LINE__int __LINE____LINE__ = \d+


推荐