for循环如何与实例一起使用?

时间:2019-03-03 18:50:43

标签: java log4j

在寻找一种将日志实际写入log4j库中文件的方法时,在以下方法中找到

  public void callAppenders(LoggingEvent event) {
    int writes = 0;
    for (Category c = this; c != null; c = c.parent) {
      synchronized (c) {
        if (c.aai != null) {
          writes += c.aai.appendLoopOnAppenders(event);
        }
        if (!c.additive) {
          break;
        }
      }
    }
    if (writes == 0) {
      this.repository.emitNoAppenderWarning(this);
    }
  }

但是无法理解for循环中发生了什么。谁能帮助我了解这里的迭代过程?永远不要碰到这种代码片段..!

更新:

我编写了使用一种方法登录日志文件的代码。在该方法中,它调用下面来自log4j库的方法

  public void log(String callerFQCN, Priority level, Object message, Throwable t) {
    if (this.repository.isDisabled(level.level)) {
      return;
    }
    if (level.isGreaterOrEqual(getEffectiveLevel())) {
      forcedLog(callerFQCN, level, message, t);
    }
  }

从这里是forceLog方法

  protected void forcedLog(String fqcn, Priority level, Object message, Throwable t) {
    callAppenders(new LoggingEvent(fqcn, this, level, message, t));
  }

这最后调用了顶部的callAppenders方法提及。 protected volatile Category parent;存在于Category类中,所有上述方法也是该类的一部分。

谢谢

1 个答案:

答案 0 :(得分:1)

可能您习惯于看到类似这样的循环

for (int i=0; i<10; i++) { ... }

,并了解此操作将i0迭代到10以下,即9

也许您发现此循环的语法有点怪异,但从未对此有更深入的了解。所以,让我们现在开始。

  • 第一部分int i=0是创建迭代初始状态的语句。在这里,它定义了一个名为i的新整数变量,并将其初始化为0。这就是为什么此循环从0开始的原因。
  • 第二部分i<10是一个布尔表达式,它决定是否(进一步)执行循环体。这个定义了只要i小于10,就应该重复循环。
  • 第三部分i++定义了迭代之间要更改的内容。在这里,它会将i增加1

现在,让我们看一下代码段

for (Category c = this; c != null; c = c.parent) { ... }
  • 第一部分Category c = this创建一个类型为Category的新变量,并将其初始化为this。因此,对于第一次迭代,c将是this
  • 第二部分c != null定义了只要类别c不是null,循环就会重复。
  • 第三部分c = c.parent定义每次下一次循环迭代都使用当前类别的父级。

类别对象似乎具有父字段,从而创建链,直到最顶层的类别在此字段中具有空值。因此,循环遵循从当前类别到最顶层的链。

因此,迭代是:

  • c = this;
  • c = this.parent;
  • c = this.parent.parent;
  • c = this.parent.parent.parent;

直到c变为null(因为某些最终父代本身具有空父代)。循环体不会创建或修改任何Category实例,这意味着循环仅遵循开始循环之前已建立的Category父层次结构。

因此,如果到目前为止仅使用for (int i=0; i<10; i++) { ... }模式,那么您将错过for循环的许多功能和灵活性。