如果不使用返回值,Class.forName()的用途是什么?

Dan*_*ski 20 java jdbc classloader

我在示例应用程序中看到了使用商业JDBC驱动程序的这一行:

Class.forName("name.of.a.jcdb.driver")
Run Code Online (Sandbox Code Playgroud)

不使用返回值.

这条线的目的是什么?

Noo*_*ilk 25

它执行该类的静态加载.所以static { }块中的任何东西都会运行.

  • 这让驱动程序类在JDBC框架中注册自己.这是允许JDBC正确识别您在以后的调用中传递的连接URL所必需的. (4认同)

ZZ *_*der 12

也许一些代码片段会有所帮助.这是来自Sun的JDBC-ODBC桥驱动程序,

//--------------------------------------------------------------------
// Static method to be executed when the class is loaded.
//--------------------------------------------------------------------


static
{       
    JdbcOdbcTracer tracer1 = new JdbcOdbcTracer();
    if (tracer1.isTracing ()) {
        tracer1.trace ("JdbcOdbcDriver class loaded");
    }

    JdbcOdbcDriver driver = new JdbcOdbcDriver ();

    // Attempt to register the driver

    try {
        DriverManager.registerDriver (driver);
    }
    catch (SQLException ex) {
        if (tracer1.isTracing ()) {
            tracer1.trace ("Unable to register driver");
        }  
    }
}
Run Code Online (Sandbox Code Playgroud)

DriverManager.registerDriver()每当加载驱动程序时,都会执行静态块中的调用Class.forName().

这曾经是注册驱动程序的唯一方法.JDBC 4.0引入了一种新的服务注册机制,因此您不再需要使用较新的JDBC 4.0兼容驱动程序.


Mic*_*rdt 5

在您的具体示例中,JDBC驱动程序类包含一个静态初始化程序,用于DriverManager注册驱动程序.