在Java中,连接到mysql,Class.forName的含义是什么?

Ita*_*vka 5 java mysql

这条线的目的是什么?
它不返回值或设置现有类/对象的状态(或者是?)

Class.forName ("com.mysql.jdbc.Driver").newInstance ();
Run Code Online (Sandbox Code Playgroud)

bwa*_*wok 8

它使用反射来查看名为"com.mysql.jdbc.Driver"的类的类路径,并创建它的新实例.

在你编写的代码中

Integer foo = new Integer()
Run Code Online (Sandbox Code Playgroud)

你可以改写

Integer foo = Class.forName("java.lang.Integer").newInstance()
Run Code Online (Sandbox Code Playgroud)

但为什么要解决这一切呢?因为您希望在运行时加载数据库驱动程序,而不是硬编码.因此,如果您更改数据库,则只需更改将加载其他数据库驱动程序的配置文件.在您的特定情况下,它可能无关紧要,但它确实为数据库配置开辟了新的可能性(这个Class.forName爵士通常是这样做的)


emo*_*ory 7

几乎可以肯定,com.mysql.jdbc.Driver有一个静态初始化器,如下所示:

static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())};
Run Code Online (Sandbox Code Playgroud)

使用forName方法时会调用此静态初始化程序.所以没有意识到你注册了MySQL驱动程序.

至于新的实例,我不知道它为什么存在.这似乎没必要.


Jac*_*ack 1

其目的是动态加载由作为字符串参数传递的完全限定名称指定的类定义。

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

如果该类之前已经加载过,那么它已经在缓存中,并且不会再次从文件中检索。(对此不是100%确定,也许您可​​以在运行时“更新”类定义,但我个人认为这会造成不一致)