我正在阅读有关 java.sql.DriverManager 的源代码,发现了一些令人困惑的地方。这是代码:
static {
loadInitialDrivers();
println("JDBC DriverManager initialized");
}
......
public static void println(String message) {
synchronized (logSync) {
if (logWriter != null) {
logWriter.println(message);
// automatic flushing is never enabled, so we must do it ourselves
logWriter.flush();
}
}
}
logWriter 在类初始化时没有设置,但是被它的静态 block 调用了。所以我看不到任何关于这个的日志信息。 如何在类初始化之前设置字段值?
最佳答案
唯一的方法是在 Driver
实现中设置 logWriter
。
public class MyDriver implements Driver {
static {
// DriverManager will use ServiceLoader to load this class
DriverManager.setLogWriter(new PrintWriter(System.out));
}
... all methods in Driver
}
然后你会得到日志
DriverManager.initialize: jdbc.drivers = null
JDBC DriverManager initialized
编辑
对于@moilejter 的问题,这里给出了两个类如何相互调用的简单示例,即使它们都没有准备好。
public class JustTest {
public static void main(String[] args) throws java.lang.Exception {
A.i = 2;
}
}
class A {
static int i = 1;
static {
System.out.println("a block start");
B.print();
}
public static void print() {
System.out.println("a print: " + B.i);
}
}
class B {
static int i = 1;
static {
System.out.println("b block start");
A.print();
}
public static void print() {
System.out.println("b print: " + A.i);
}
}
关于java - 如何在类初始化之前设置字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51533343/