2

我正在阅读有关 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 在类初始化时没有设置,而是被它的静态块调用。所以我看不到任何关于这个的日志信息。如何在类初始化之前设置字段值?

4

2 回答 2

0

唯一的方法是logWriterDriver实现中设置。

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);
  }
}
于 2018-07-26T07:43:55.040 回答
-1

如果您使用以下代码,则可以使用此代码Console

DriverManager.setLogWriter(new PrintWriter(System.out));  
于 2018-07-26T07:45:16.333 回答