您将看到的另一个重要用途是加载 JDBC 驱动程序。这可能是大多数 java 程序员第一次使用 Class.forName。你会看到是这样的:
Class.forName("oracle.jdbc.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:...");
这里发生的是,当 OracleDriver 类被加载(通过 Class.forName)时,它包含一个类似这样的类初始化块(它可能更复杂,但说明了这一点)。该块作为类加载过程的一部分运行。
public class OracleDriver {
static {
DriverManager.registerDriver(new OracleDriver());
}
}
然后当你调用 DriverManager.getConnection 时,它会询问所有已注册的驱动程序是否能够处理给定的 url(代码比较复杂,但我会简化一下):
for (Driver driver : registeredDrivers) {
if (driver.acceptsURL(url)) {
// use this driver
}
}
至于您的实例化问题, Class.newInstance() 方法将始终调用无参数构造函数,如果不存在则抛出异常。如果你想要一个特定的构造函数,你可以在类本身上使用“getConstructor”方法。例如,如果你想要一个接受 String 和 Long 的构造函数:
Class clazz = ...; // figure out which class here
Constructor c = clazz.class.getConstructor(String.class, Long.class);
Object o = c.newInstance("foo", new Long(1L));