public static Class<?> forName(String name, boolean initialize, ClassLoader loader)
只有 initialize
参数为 true
且以前未被初始化时,才初始化该类。
初始化分为类初始化和,实例初始化。
静态块是属于类的,因此,只在类第一次初始化时,才运行。
只加载该类,其静态块是不会运行的。
com.mysql.jdbc.Driver driver; //虽然加载了该类,但没有初始化(静态块,静态变量) ×
com.mysql.jdbc.Driver driver=new com.mysql.jdbc.Driver(); //加载类,实例化,初始化(类和实例) 〇
Class.forName("com.mysql.jdbc.Driver"); //加载该类,并进行初始化(静态块,静态变量) 〇
public static Class<?> forName(String className) 的initialize默认值为true
public static Class<?> forName(String name, boolean initialize, ClassLoader loader)
最终调用的是私有的
private static native Class forName0(String name, boolean initialize,ClassLoader loader)方法
我们在JDBC中采用
Class.forName("com.mysql.jdbc.Driver");
相当于
Class.forName("com.mysql.jdbc.Driver",true,Thread.currentThread().getContextClassLoader());
即加载mysql驱动器类,并初始化其静态块。静态块中的内容为,向DriverManager注册该驱动器类本身
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}
然后DriverManager遍历已注册的JDBC驱动器,根据给定的url, username, password,连接数据库,连接成功返回一个连接
Connection conn = DriverManager.getConnection(url, username, password)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-