在我们熟悉的Spring框架中的IOC的实现就是使用的ClassLoader。
而在我们使用JDBC时通常是使用Class.forName()方法来加载数据库连接驱动。这是因为在JDBC规范中明确要求Driver(数据库驱动)类必须向DriverManager注册自己。
以MySQL的驱动为例解释:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
 | 
public class Driver extends NonRegisteringDriver implements java.sql.Driver {      // ~ Static fields/initializers      // ---------------------------------------------         //      // Register ourselves with the DriverManager      //      static {          try {              java.sql.DriverManager.registerDriver(new Driver());          } catch (SQLException E) {              throw new RuntimeException("Can‘t register driver!");          }      }         // ~ Constructors      // -----------------------------------------------------------         /**      * Construct a new driver and register it with DriverManager      *       * @throws SQLException      *             if a database error occurs.      */     public Driver() throws SQLException {          // Required for Class.forName().newInstance()      }  } | 
我们看到Driver注册到DriverManager中的操作写在了静态代码块中,这就是为什么在写JDBC时使用Class.forName()的原因了。
好了,今天就写到这了,最近在面试,遇到了很多问题,也学习了不少,虽然很累,但是也让人成长了不少,毕竟面试就是一个脱皮的过程,会遇到各种企业各种面试官各种问题,各种场景。给自己加油吧,找一个最少能让自己干个几年的公司,别总是让我遇到工作了没多久公司就垮掉的这种就行了。要不我也很无奈啊。
        







请问这句话
最后调用的方法是forName0这个方法,在这个forName0方法中的第二个参数被默认设置为了true,这个参数代表是否对加载的类进行初始化,设置为true时会类进行初始化,代表会执行类中的静态代码块,以及对静态变量的赋值等操作。
这个值难道是跳过类加载第二步链接中的初始化步骤么?
但是我自己测试的时候设置这个参数为false的时候,静态的变量也完成了赋值操作啊,和值为true没有区别啊
public class Test {
public static void main(String[] args) throws Exception {
System.out.println(“initialize…”);
Class c = Class.forName(“TestStatic”, false, Test.class.getClassLoader());
System.out.println(“1. i = ” + TestStatic.i);
System.out.println(“instance…”);
System.out.println(“2. i = ” + TestStatic.i);
Object obj = c.newInstance();
System.out.println(“end …”);
}
}
public class TestStatic {
static int i = 9;
static {
System.out.println(“*******************”);
}
}
结果 1和2两处的i值都为9呢,如果跳过初始化步骤那么在链接的准备阶段应该会给i赋值int类型的默认值0的吧,所以1处应该是0,2处是9。请问这个是什么原因呢?
System.out.println(“2. i = ” + TestStatic.i);
Object obj = c.newInstance();
这两句顺序反了,不过结果还是一样的,都为9,