这条线的目的是什么?
它不返回值或设置现有类/对象的状态(或者是吗?)
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
答案 0 :(得分:8)
它使用反射来查看名为“com.mysql.jdbc.Driver”的类的类路径,并创建它的新实例。
在您编写的代码中
Integer foo = new Integer()
你可以写
Integer foo = Class.forName("java.lang.Integer").newInstance()
但为什么要解决这个问题?因为您希望在运行时加载数据库驱动程序,而不是硬编码。因此,如果您更改数据库,则只需更改将加载其他数据库驱动程序的配置文件。在您的具体情况下,它可能无关紧要,但它确实为数据库配置开辟了新的可能性(这个Class.forName爵士乐通常是这样做的)
答案 1 :(得分:7)
几乎可以肯定,com.mysql.jdbc.Driver有一个静态初始化程序,如下所示:
static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())};
使用 forName 方法时会调用此静态初始值设定项。所以没有意识到你注册了MySQL驱动程序。
至于 newInstance ,我不知道为什么会这样。这似乎没必要。
答案 2 :(得分:3)
它加载MySQL JDBC驱动程序。
你这样做的原因是你不直接使用这个类,因此没有静态绑定到类名。当您尝试打开数据库连接时,只需使用java.sql.Connection
而不是MySQL特定的类或接口。该翻译是在动态类加载的幕后完成的。
您正在加载该类,以便在您随后建立连接时可以将其自身注册到JDBC子系统。
答案 3 :(得分:1)
它的目的是动态加载由作为字符串参数传递的完全限定名称指定的类定义。
这意味着JVM将有效搜索类路径项中的.class
文件,然后使用newInstance()
请求该类的新实例。
如果该类之前已经加载过,那么它已经在缓存中,并且不会再次从文件中检索到。 (不是100%肯定它,也许你可以在运行时“更新”一个类定义,但我个人觉得它会造成不一致)
答案 4 :(得分:1)
调用Class.forName creates an instance of your driver。
答案 5 :(得分:1)
对Class.forName(“X”)的调用会导致名为X的类被动态加载(在运行时)。
答案 6 :(得分:1)
当你运行java程序时,你有类路径和默认位置来获取一些jar(包含类)和类。 JVM将加载所有这些jar(包含类)和类以准备启动java程序。
Class.forName(“className”)查看所有这些已加载的类,以返回特定的“className”,以便您从中创建实例/对象。
这是一种动态方式,与编译时对象实例化相同:
ClassName classInstance = new ClassName();
答案 7 :(得分:1)
Class.forName用于加载指定完整类名的Class对象。当加载对象(这里是指com.mysql.jdbc.Driver)时,将调用静态表达式。因此,虽然未调用Class.newInstance()来创建新实例,但com.mysql.jdbc.Driver中必须有一些静态初始化。
答案 8 :(得分:-1)
返回与给定字符串名称
的类相关联的Class对象
这意味着,它将返回(或尝试)返回类com.mysql.jdbc.Driver
创建此[...]对象所代表的类的新实例
那么,该行的作用是动态创建一个mysql驱动程序实例。
此:
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
相当于:
import java.sql.Driver;
....
Driver driver = new com.mysql.jdbc.Driver()
按照DriverManager doc的说法,您不必再使用它了:
应用程序不再需要使用Class.forName()
明确加载JDBC驱动程序
需要加载驱动程序,但现在DriverManager使用其他策略。
最后,请阅读:
注意: 数据源接口是JDBC 2.0 API中的新增功能,提供了另一种连接数据源的方法。使用DataSource对象是连接数据源的首选方法。