刚接触jdbc就有一个很严重的问题困扰着我:
当我们把数据库注册进DriverManager中的时候,我们居然只需要调用Class.forName("某数据库")装载类到JVM里面就可以了,这是另我很不解的,为毛不需要实例化啊;
你不实例化DriverManager究竟是靠什么找到这个数据库的呢?
这得靠反射完成:
1.首先我们的了解static语句块的作用:
在每一个类中写了static语句块的话,当我们进行反射时Class.forName我们调用class的这个方法将类装载到我们的jvm时候,我们static就会调用一次(注意是一次,这就表明不是我们每次实例化都调用他,无论你实例化几次他都是只调用一次);
2.static语句块能做什么:
这样的话,就是说当我们在用Class.forName("com.mysql.jdbc.Driver")(单单拿mysql举例子)的时候,我们会调用com.mysql.jdbc.Driver的static一次;
3.这种机制能做什么:
我们看看反编译com.mysql.jdbc.Driver的结果(话说com.mysql.jdbc.Driver真是吊炸):
package com.mysql.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException { }
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
}
果然是自己调用然后将自己注册上去,这样就很明了了,无论我们
Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver").newInstance();
new com.mysql.jdbc.Driver();
这样三种写都是可以很方便的注册上去(都吊了static);
4.作用:我估计是用来节省内存啥的吧