类initialziation是否检查其成员方法?

时间:2013-05-12 10:47:28

标签: java class initialization

如下面的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);
  }

}

2 个答案:

答案 0 :(得分:1)

使用Log4jImpl.class不会加载任何其他类。在构造函数中使用它们时会加载它们。

BTW通常XxxxImpl意味着你有一个接口Xxxx的实现

答案 1 :(得分:1)

Logger的构造函数中调用静态getLogger方法时,将发生类Log4jImpl的初始化。调用其中一个静态字段时,Level类的初始化将发生:Level.ERRORLevel.DEBUG ...

查看Java language specs

中何时进行类初始化
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;
    }
}