它似乎既不返回任何值,也不改变现有类/对象的状态(或者说它是这样的吗?)
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
Integer foo = new Integer()
你可以选择写成
Integer foo = Class.forName("java.lang.Integer").newInstance()
但是为什么要费这么大劲呢?因为你想在运行时加载数据库驱动程序,而不是硬编码它。因此,如果你更改了数据库,只需更改一个配置文件,该文件将加载不同的数据库驱动程序。在您的特定情况下可能无关紧要,但它确实为数据库配置打开了新的可能性(而Class.forName就是通常的方法)。
static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())};
当你使用forName方法时,会调用这个静态初始化程序。因此,你无意中注册了MySQL驱动程序。
至于newInstance,我不知道它为什么存在。看起来是不必要的。
它加载了MySQL JDBC驱动程序。
你这样做的原因是你不会直接使用这个类,所以没有静态绑定到类名。当你尝试打开一个数据库连接时,你只需使用一个java.sql.Connection
而不是一个特定于MySQL的类或接口。这个转换是在幕后通过动态类加载完成的。
你加载这个类是为了让它在你随后建立连接时向JDBC子系统注册自己。
ClassName classInstance = new ClassName();
它的目的是根据传递的字符串参数动态加载指定的完全限定名称的类定义。
这意味着JVM将在类路径项中有效地搜索.class
文件,然后使用newInstance()
请求该类的新实例。
如果该类已经在之前被加载过,则已经在缓存中,并且不会再次从文件中检索。(不确定是否可以在运行时“更新”类定义,但我个人认为这会创建不一致性)
Class.forName用于加载指定完整类名的Class对象。当对象,这里指的是com.mysql.jdbc.Driver,被加载时,静态表达式将被调用。因此,虽然没有调用Class.newInstance()来创建新实例,但在com.mysql.jdbc.Driver中必须有一些静态初始化。
返回与给定字符串名称相关联的类对象[...]的类
这意味着它将返回(或尝试返回)类com.mysql.jdbc.Driver
创建此[...]对象所表示的类的新实例
因此,该行的作用是动态创建一个mysql Driver实例。
这个:
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
将相当于:
import java.sql.Driver;
....
Driver driver = new com.mysql.jdbc.Driver()
顺便提一下,根据DriverManager文档,您不再需要使用它了:
应用程序不再需要使用Class.forName()显式加载JDBC驱动程序
以前需要加载驱动程序,但现在DriverManager使用其他策略。
最后,请阅读:
注意:JDBC 2.0 API中的新接口DataSource提供了另一种连接到数据源的方式。使用DataSource对象是连接到数据源的首选方法。