在Java中,连接mysql时,Class.forName的意思是什么?

5
这行代码的目的是什么?
它似乎既不返回任何值,也不改变现有类/对象的状态(或者说它是这样的吗?)
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
9个回答

8
它使用反射在类路径中查找名为“com.mysql.jdbc.Driver”的类,并创建一个新实例。
当您编写代码时,例如:
Integer foo = new Integer()

你可以选择写成

Integer foo = Class.forName("java.lang.Integer").newInstance()

但是为什么要费这么大劲呢?因为你想在运行时加载数据库驱动程序,而不是硬编码它。因此,如果你更改了数据库,只需更改一个配置文件,该文件将加载不同的数据库驱动程序。在您的特定情况下可能无关紧要,但它确实为数据库配置打开了新的可能性(而Class.forName就是通常的方法)。


好吧,它无论如何都是硬编码的。虽然是一个字符串,但你需要重新编译以切换驱动程序。在Java 6和JDBC 4中,这不再需要,可以在这里看到:http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html。 - kolrie

7
几乎可以确定,com.mysql.jdbc.Driver 有一个静态初始化器,看起来像这样:
static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())};

当你使用forName方法时,会调用这个静态初始化程序。因此,你无意中注册了MySQL驱动程序。

至于newInstance,我不知道它为什么存在。看起来是不必要的。


顺便提一下,不再需要使用“Class.forName”了。驱动程序可以在没有它的情况下由驱动程序管理器找到:http://download-llnw.oracle.com/javase/6/docs/api/java/sql/DriverManager.html - OscarRyz
在MySQL文档中 - http://dev.mysql.com/doc/refman/5.5/en/connector-j-usagenotes-connect-drivermanager.html提到,.newInstance()被用作破解Java实现中存在的问题的一个方法。 - Jason Sperske

3

它加载了MySQL JDBC驱动程序。

你这样做的原因是你不会直接使用这个类,所以没有静态绑定到类名。当你尝试打开一个数据库连接时,你只需使用一个java.sql.Connection而不是一个特定于MySQL的类或接口。这个转换是在幕后通过动态类加载完成的。

你加载这个类是为了让它在你随后建立连接时向JDBC子系统注册自己。


1
当您运行Java程序时,您有类路径和默认位置来获取一些JAR文件(包含类)和类。 JVM将加载所有这些JAR文件(包含类)和类以准备启动您的Java程序。
Class.forName(“className”)查看所有这些已加载的类,以返回特定的“className”,以便您可以从中创建实例/对象。
这是一种动态的方式,与编译时对象实例化相同:
ClassName classInstance = new ClassName();

动态意味着“className”字符串可以根据用户与程序的交互(控制台或GUI或其他动态方式)生成/提供。尽管在这个问题的示例中,“com.mysql.jdbc.Driver”是一个硬编码的字符串。 - ttchong

1

它的目的是根据传递的字符串参数动态加载指定的完全限定名称的类定义。

这意味着JVM将在类路径项中有效地搜索.class文件,然后使用newInstance()请求该类的新实例。

如果该类已经在之前被加载过,则已经在缓存中,并且不会再次从文件中检索。(不确定是否可以在运行时“更新”类定义,但我个人认为这会创建不一致性)


1

1
调用 Class.forName("X") 会导致名为 X 的类在运行时动态加载。

1

Class.forName用于加载指定完整类名的Class对象。当对象,这里指的是com.mysql.jdbc.Driver,被加载时,静态表达式将被调用。因此,虽然没有调用Class.newInstance()来创建新实例,但在com.mysql.jdbc.Driver中必须有一些静态初始化。


-1

Class.forName(String name)

返回与给定字符串名称相关联的类对象[...]的类

这意味着它将返回(或尝试返回)类com.mysql.jdbc.Driver

稍后Class.newInstace()

创建此[...]对象所表示的类的新实例

因此,该行的作用是动态创建一个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对象是连接到数据源的首选方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接