下面是Spring源码中的一个代码块:
public class SQLStateSQLExceptionTranslater implements SQLExceptionTranslater {
// Populate reference data
static {
BAD_SQL_CODES.add("07");
BAD_SQL_CODES.add("42");
BAD_SQL_CODES.add("65"); // Oracle throws on unknown identifier
BAD_SQL_CODES.add("S0"); // MySQL uses this - from ODBC error codes?
INTEGRITY_VIOLATION_CODES.add("22"); // Integrity constraint violation
INTEGRITY_VIOLATION_CODES.add("23"); // Integrity constraint violation
INTEGRITY_VIOLATION_CODES.add("27"); // Triggered data change violation
INTEGRITY_VIOLATION_CODES.add("44"); // With check violation
}
}
那么为什么要使用静态代码块呢?
有些代码必须在类被调用的时候就执行,这种代码在类被调用的时候是主动执行的;
实际上,static块的执行发生在“初始化”的阶段。初始化阶段,jvm主要完成对静态变量的初始化,静态块执行等工作。
下面我们看看执行static块的几种情况:
1、第一次new A()的过程会打印"";因为这个过程包括了初始化
2、第一次Class.forName("A")的过程会打印"";因为这个过程相当于Class.forName("A",true,this.getClass().getClassLoader());
3、第一次Class.forName("A",false,this.getClass().getClassLoader())的过程则不会打印""。因为false指明了装载类的过程中,不进行初始化。不初始化则不会执行static块。