gpt4 book ai didi

java - IntelliJ 中的源步骤后 Log4j 消息对象意外呈现

转载 作者:行者123 更新时间:2023-12-02 02:28:24 25 4
gpt4 key购买 nike

在调试一些 Java 代码 (Log4J 2.5) 时,我看到了一种我无法推理的奇怪行为。

在渲染Log4J日志消息的过程中,构造了一个Log4jLogEvent对象:

public LogEvent createEvent(String loggerName, Marker marker, String fqcn, Level level, Message data, List<Property> properties, Throwable t) {
return new Log4jLogEvent(loggerName, marker, fqcn, level, data, properties, t);
}

Log4jLogEvent 的作者 ( grepcode )是一个简单的方法,它将给定的参数分配到新构造的对象字段中:

private Log4jLogEvent(String loggerName, ... Message message, ...)
{
this.endOfBatch = false;
this.loggerName = loggerName;
this.marker = marker;
this.loggerFqcn = loggerFQCN;
this.level = level == null?Level.OFF:level;
this.message = message; // <--- issue is seen here
...

问题出在 message 字段的分配上。message 是一个 ParameterizedMessage ( grepcode ),并且有一个 formattedMessage 字段,它是一个字符串。

只需跳过 this.message = message,变量/监 window 口就会显示 message 的所有字段正如预期的那样,被复制到 this.message 中,除了 formattedMessage,它已渲染(从 >null 到实际渲染的字符串)。

源步骤之前的屏幕截图(IntelliJ Ultimate 2017.1):

enter image description here

源步骤后的屏幕截图 - 请注意 formattedMessage 的值:

enter image description here

查看ParameterizedMessage的代码,唯一可以执行此渲染的函数是formatMessage,称为通过getFormattedMessage()。所以我的工作假设是,getFormattedMessage() 以某种方式被调用。

我的问题:

  • 这是否可能 - 隐式调用 getFormattedMessage()
  • 或者是否有一些代码正在执行,但 IntelliJ 没有透露?
  • 或者我缺少一些非常基本的东西吗?

当尝试“步入”此语句时,它只是跳过它。我尝试在 getFormattedMessage()ParameterizedMessage 的所有其他函数上放置断点,但在执行此源步骤时没有命中任何内容。

最佳答案

您所看到的是 toString() 正在执行其工作。调试器显示基于 toString() 的值,在本例中,toString() 调用 getFormattedMessage()

因此,这不是作业在执行任何操作,而是调试器调用 toString() 并通过它执行操作。

关于java - IntelliJ 中的源步骤后 Log4j 消息对象意外呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47494584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com