【问题标题】:StackTraceElement getFileName() gives null on lambdasStackTraceElement getFileName() 在 lambdas 上给出 null
【发布时间】:2015-10-08 18:50:39
【问题描述】:

我有一个自定义的日志系统,它为每个日志语句显示日志语句的文件名和行号。 这很好用,除了 lambdas。对应于 lambda 内部位置的 StackTraceElement 不会产生文件名。这可能与 JVM 生成某种代码以使 lambda 工作有关,我不确定。有没有办法以某种方式获取文件名和行号?

【问题讨论】:

    标签: java lambda java-8


    【解决方案1】:

    您可以获得使用 lambda 的源文件的名称(在堆栈跟踪的前面),但由于 lambda 被编译为内部类,它们没有实际的源文件名。

    它们也没有行号,因为行号将位于您看不到的类(生成的内部类)中。

    【讨论】:

    • 令人失望的是,JVM 在运行时生成 lambda 字节码时没有携带行号和文件名信息。这让我想避免使用 lambda,尽管它们看起来很温文尔雅。此外,许多第一次查看代码的人会感到困惑。这有点像运算符重载,除非您知道所有代码的来源,否则您无法信任代码。在我看来,这些隐藏的信息并没有遵循 Java 背后的原始精神。更改为匿名内部类使其更具可读性和可调试性。
    • @Mike 查看我的编辑。也不要仅仅因为可以使用 lambdas。我不得不告诉我的同事不要在没有保证的地方使用 lambdas。仅仅因为 Java 中有一个新技巧并不意味着您需要过度使用它。
    • 在搜索了包括公司政策在内的其他人是否可能已经演变成也避免使用 lambda,并且仅在实际需要时才使用它们,然后我回到了我自己的消息。我在调试我自己的代码时变得更加反 lambda。理论上,我认为编译器可以生成了一个匿名内部类,但它正在走这条静态类的侧边路线。为什么我不确定。可能与捕获 lambda 之外的变量有关。我一看到 lambdas 就知道它们很麻烦。这就像一个糟糕的艺术家强迫他们的艺术。 Java 应该是团队开发的证明......
    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2013-09-20
    • 2013-06-30
    • 2016-01-29
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多