7

我有以下课程

public class MyClass
{
    private static final Logger logger = Logger.getLogger(MyClass.class);

    static
    {
        logger.info("some text");
    }
}

假设当我们到达logger.info时,log4j 系统已初始化并准备好发出日志,是否安全?

似乎如果我能够执行Logger.getLogger()并取回一个有效的 Logger 实例,这意味着 Log4j 已初始化,对吧?

4

2 回答 2

7

是的。静态初始化器(即static {}块和静态变量的初始赋值)按照它们声明的顺序执行。

log4j 的默认初始化依赖于 log4j 类LogManager中的静态块,该块在类加载后执行Logger,并且在第一次使用之前加载。这就是为什么你的建筑工作。

于 2012-09-19T08:10:46.163 回答
0

请参阅JLS的这一部分。它讨论了当你初始化一个类时会发生什么。部分讨论静态初始化器。在回答您的问题时,AFAIK 静态块按照它们发生的顺序执行。它们将在加载类时执行,这可能在您创建它的实例或访问它的静态变量/方法时发生。

于 2012-09-19T08:19:04.177 回答