Class.forName()可以没有返回值吗?

最近在看数据库连接池源码的时候遇到了一个问题:

    /*构造方法,做一些初始化工作*/  
    private ConnectionPool() {  
        pool = new Vector<Connection>(poolSize);  
  
        for (int i = 0; i < poolSize; i++) {  
            try {  
                Class.forName(driverClassName);  
                conn = DriverManager.getConnection(url, username, password);  
                pool.add(conn);  
            } catch (ClassNotFoundException e) {  
                e.printStackTrace();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  
    }  

这是数据库连接池的一个构造函数,发现了这样一行代码觉得有些疑惑:

Class.forName(driverClassName); 

这个是我们常见的反射机制,通过类名获取一个类,但是这里的Class.forName()没有返回值,但是我在JDK文档里查看方法明明是如下定义的:

public static Class forName(String className) throws ClassNotFoundException

具体看看怎么回事,查阅了一番之后发现,Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:

public class MyJDBCDriver implements Driver {
  static {
     DriverManager.registerDriver(new MyJDBCDriver());
  }
}

所以在JDBC中直接通过Class.forName(driverClassName)将对应的driver向DriverManager进行注册就可以了。


版权声明:本文为bbbbobbb原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。