如下面的Log4jImpl类,我想知道它的'初始化(类初始化不是对象),是否会导致org.apache.log4j.Level
和org.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);
}
}
答案 0 :(得分:1)
使用Log4jImpl.class不会加载任何其他类。在构造函数中使用它们时会加载它们。
BTW通常XxxxImpl意味着你有一个接口Xxxx的实现
答案 1 :(得分:1)
在Logger
的构造函数中调用静态getLogger
方法时,将发生类Log4jImpl
的初始化。调用其中一个静态字段时,Level
类的初始化将发生:Level.ERROR
,Level.DEBUG
...
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;
}
}