1

作为下面的类Log4jImpl,我想知道它的初始化(类初始化不是对象),是否会导致org.apache.log4j.Levelorg.apache.log4j.Logger被初始化?


import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class Log4jImpl{

  private static final String FQCN = Log4jImpl.class.getName();

  private Logger log;

  public Log4jImpl(String clazz) {
    log = Logger.getLogger(clazz);
  }

  public boolean isDebugEnabled() {
    return log.isDebugEnabled();
  }

  public boolean isTraceEnabled() {
    return log.isTraceEnabled();
  }

  public void error(String s, Throwable e) {
    log.log(FQCN, Level.ERROR, s, e);
  }

  public void error(String s) {
    log.log(FQCN, Level.ERROR, s, null);
  }

  public void debug(String s) {
    log.log(FQCN, Level.DEBUG, s, null);
  }

  public void trace(String s) {
    log.log(FQCN, Level.TRACE, s, null);
  }

  public void warn(String s) {
    log.log(FQCN, Level.WARN, s, null);
  }

}
4

2 回答 2

1

使用 Log4jImpl.class 不会加载任何额外的类。当您在构造函数中使用它们时,它们将被加载。

顺便说一句,通常 XxxxImpl 意味着您有一个接口 Xxxx 的实现

于 2013-05-12T10:51:33.917 回答
1

类的初始化Logger将在其静态getLogger方法被调用时发生:在Log4jImpl. 类的初始化Level将在其静态字段之一被调用时发生:Level.ERROR, Level.DEBUG...

查看Java 语言规范中何时发生类初始化。

interface I {
    public static final int i = 1, ii = Test10.out("ii", 2), kk = Test10.out("kk", 3);
}
interface J extends I {
    int j = Test10.out("j", 3), jj = Test10.out("jj", 4);
}
interface K extends J {
    int k = Test10.out("k", 5);
}
class Test10 {
    public static void main(String[] args) {
        System.out.println(J.ii);
        System.out.println(K.j);
    }
    static int out(String s, int i) {
        System.out.println(s + "=" + i);
        return i;
    }
}
于 2013-05-12T11:11:21.627 回答