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、静的フィールドの 1 つが呼び出されると発生します: 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 に答える