更好的理解 - Class.forName(“com.mysql.jdbc.Driver”)。newInstance();

时间:2012-10-17 11:17:38

标签: java mysql

我遇到了this helpful link with code,在更新时可以很好地运行,以便点击我的网络服务器。我绝对可以做到一切。

现在,我唯一不完全理解的是Class.forName()

为什么要使用它?可以这样做吗?这是一个解决其他问题的工作吗?添加参考?创建一个类来实现/扩展另一个?

我想完全理解发生了什么,但这是我的方式。

谢谢

4 个答案:

答案 0 :(得分:9)

该代码强制表示MySQL驱动程序的类加载和初始化。在Java中,除非必需该类被加载,否则不会加载类。由于JDBC代码通常永远不会直接引用驱动程序,因此如果没有Class.forName(或其他一些等效的替代方法),它就不会被加载。

请注意,加载初始化类都是必要的,这是两个不同的东西。

另外,请注意,没有必要调用.newInstance() - 驱动程序的静态初始化程序已将自身注册为JDBC驱动程序。

最后请注意,使用 Service Loader API 时,通常无需调用Class.forName()来加载驱动程序:它可以自动加载。

答案 1 :(得分:7)

Class.forName(className)使用指定的className加载该类。

以这种方式加载JDBC驱动程序,以避免必须对特定的JDBC驱动程序具有编译时依赖性。我们的想法是使用Java的JDBC API(包java.sqljavax.sql中定义的类和接口),而不必直接引用特定的JDBC驱动程序。

当您让Java使用forName调用加载驱动程序类时,驱动程序将自行注册以便可以使用它。

请注意,对于大多数JDBC驱动程序,不必显式创建驱动程序类的新实例;你可以不用.newInstance()电话。

请注意,由于JDBC 4.0版本不再需要Class.forName()调用 - 发现驱动程序的过程已得到改进,JDBC可以自动加载它们。

答案 2 :(得分:5)

所有JDBC驱动程序都有一个静态块,它使用DriverManager注册自己,而DriverManager只有静态初始化程序。

MySQL JDBC Driver有一个静态初始化程序,如下所示:

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

JVM执行静态块,驱动程序使用DriverManager注册自身。 您需要数据库连接来操作数据库。为了创建与数据库的连接,DriverManager类必须知道要使用哪个数据库驱动程序。它通过遍历已向其注册的驱动程序的数组(内部为Vector)并在数组中的每个驱动程序上调用acceptsURL(url)方法来实现,有效地要求驱动程序告诉它是否可以处理JDBC URL。

答案 3 :(得分:0)

您可以使用例如:

import com.mysql.jdbc.Driver;

public class MyClass {
   //[...]
   public void myMethod() {
        Class<Driver> clz = Driver.class;
        Driver driver = clz.newInstance();
   }
}

但这不是那么灵活;例如,您可以从配置文件中读取名称“com.mysql.jdbc.Driver”。也许您想要使用其他驱动程序(来自Oracle)并且您不想更改代码;以上述方式,这是不可能的,所以正确的方法是使用Class.forName(name)

相关问题