java - 如何在类初始化之前设置字段值?

标签 java class in-class-initialization

我正在阅读有关 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/

相关文章:

php - 自定义 Composer 命名空间找不到类

C++初始化类成员变量依赖于其他成员变量

java - 在我的应用程序上下文中启动 Android 应用程序

javascript - 具有相同类的容器具有单独的 jquery 效果

class - 为什么在混合特征时会创建一个匿名类?

c++ - 无法从成员变量中的初始化字符串推断数组大小的原因是什么?

c++ - 类内初始化顺序与构造函数初始化列表

java - hibernate 文档: Parent/Child type relationship

java - 如何将 Mat 转换为位图?(在 linux 上运行,而不是 android)

java - 为什么x和y坐标必须在paintComponent()内部初始化?