JDBC在getConnection之前为什么要调用Class.forName
获取一个数据库连接的通用模板如下:
String driver = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user = "scott";
String password = "ticmy";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
里面有个
Class.forName(driver)
,这句话有什么作用?Class.forName
做了什么。
假设一个类以前从来没有被装进内存过,Class.forName(String className)
这个方法会做以下几件事情:
1、装载。将字节码读入内存,并产生一个与之对应的java.lang.Class
类对象
2、连接。这一步会验证字节码,为static
变量分配内存,并赋默认值(0或null),并可选的解析符号引用(这里不理解没关系)
3、初始化。为类的static
变量赋初始值,假如有static int a = 1
;这个将a赋值为1的操作就是这个时候做的。除此之外,还要调用类的static
块。(这一步是要点)
Class.forName(String className)
方法会将这三步都做掉,如下面的例子:
package com.ticmy.oracle;
public class TestClinit {
public static void main(String[] args) throws Exception {
Class.forName("com.ticmy.oracle.ABC");
}
}
class ABC {
private static int a = getNum();
static {
System.out.println("this is static block");
}
public static int getNum() {
System.out.println("getNum");
return 1;
}
}
程序的运行结果是:
getNum
this is static block
Class.forName(driver)的根本目的就是为了调用DriverManager.registerDriver。