Class.forName即完成了类加载步骤的静态块加载这一步,还没有完成成员初始化的工作。
例如JDBC中首先要写一句Class.forName("com.mysql.jdbc.Driver"); 该类源代码如下
package com.mysql.jdbc
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()
}
}
即会执行该类的静态代码块,因为JDBC要首先注册驱动
但也可以在Class.forName时不让其执行静态代码块,让其在newInstance时跟成员初始化一起进行
public class Test {
public String a = "abc";
{
System.out.println("456");
}
static{
System.out.println("123");
}
public Test(){
System.out.println("create");
}
}
然后在另一个类的main方法中执行
Class.forName("com.test5.Test",false,com.test5.Test.class.getClassLoader());
则什么也不会打印,如果不加参数
Class.forName("com.test5.Test");
则会打印出123,如果实例化该类,则会打印出
123
456
create
浙公网安备 33010602011771号