JDBC class.forName 生成的实例与DriverManger注册的实例是不是同一个?

pandajava 2013-11-18 12:14:46
Class.forName("com.mysql.jdbc.Driver");
是加载并生成一个com.mysql.jdbc.Driver实例。
与 DriverManager中注册的
package com.mysql.jdbc

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// --------------------------------------------- //
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
// ~ Constructors
// -----------------------------------------------------------
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}

是否为同一个实例?

代码看来是new的一个新的。请大神解释下原因?
是否我对Class.forName("com.mysql.jdbc.Driver"); 理解有误

即初始化与实例化的区别?
...全文
296 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdgdf566 2013-11-19
  • 打赏
  • 举报
回复
引用 5 楼 pandajava 的回复:
[quote=引用 4 楼 jdgdf566 的回复:] 这个问题,我是这么理顺的:

import com.mysql.jdbc.Driver;
.
.
.
java.sql.DriverManager.registerDriver(new Driver());
我是这么写的。不用Class.forName,ClassLoader。运行无疑是没有问题的。高手说说意义上有什么不妥吗?
new Driver() 是对Driver类的主动使用,会导致这个类被jvm 加载链接和初始化。 [/quote] 那就对了。
pandajava 2013-11-19
  • 打赏
  • 举报
回复
引用 3 楼 AA5279AA 的回复:
Class.forName 其实也是调用了loadClass的方法。 然后又做了一些数据加载的操作,但是构造方法是未执行的,
构造方法是在生成实例的时候调用的
pandajava 2013-11-19
  • 打赏
  • 举报
回复
引用 4 楼 jdgdf566 的回复:
这个问题,我是这么理顺的:

import com.mysql.jdbc.Driver;
.
.
.
java.sql.DriverManager.registerDriver(new Driver());
我是这么写的。不用Class.forName,ClassLoader。运行无疑是没有问题的。高手说说意义上有什么不妥吗?
new Driver() 是对Driver类的主动使用,会导致这个类被jvm 加载链接和初始化。
jdgdf566 2013-11-19
  • 打赏
  • 举报
回复
引用 8 楼 forgetsam 的回复:
[quote=引用 4 楼 jdgdf566 的回复:] 这个问题,我是这么理顺的:

import com.mysql.jdbc.Driver;

java.sql.DriverManager.registerDriver(new Driver());
我是这么写的。不用Class.forName,ClassLoader。运行无疑是没有问题的。高手说说意义上有什么不妥吗?
具体到你的代码要怎么用 换个数据库别人是改参数,你是改代码。[/quote] 原来是这样。改哪里的参数?
forgetsam 2013-11-19
  • 打赏
  • 举报
回复
引用 4 楼 jdgdf566 的回复:
这个问题,我是这么理顺的:

import com.mysql.jdbc.Driver;

java.sql.DriverManager.registerDriver(new Driver());
我是这么写的。不用Class.forName,ClassLoader。运行无疑是没有问题的。高手说说意义上有什么不妥吗?
具体到你的代码要怎么用 换个数据库别人是改参数,你是改代码。
forgetsam 2013-11-18
  • 打赏
  • 举报
回复
Class.forName("com.mysql.jdbc.Driver"); 只加载类 Class.forName("com.mysql.jdbc.Driver").newInstance(); 实例化对象 Class.forName("")是为了加载类,从而调用里面的静态代码块,然后注册驱动
jdgdf566 2013-11-18
  • 打赏
  • 举报
回复
这个问题,我是这么理顺的:

import com.mysql.jdbc.Driver;
.
.
.
java.sql.DriverManager.registerDriver(new Driver());
我是这么写的。不用Class.forName,ClassLoader。运行无疑是没有问题的。高手说说意义上有什么不妥吗?
失落夏天 2013-11-18
  • 打赏
  • 举报
回复
Class.forName 其实也是调用了loadClass的方法。 然后又做了一些数据加载的操作,但是构造方法是未执行的,
pandajava 2013-11-18
  • 打赏
  • 举报
回复
引用 1 楼 forgetsam 的回复:
Class.forName("com.mysql.jdbc.Driver"); 只加载类 Class.forName("com.mysql.jdbc.Driver").newInstance(); 实例化对象 Class.forName("")是为了加载类,从而调用里面的静态代码块,然后注册驱动
查阅资料得 调用forName("X") 将导致名为 X 的类被初始化。初始化的过程中会执行该类的静态代码块 对于楼上的补充 Cl ass.forName("com.mysql.jdbc.Driver"); //只加载类 补充 除了加载之外还完成了连接和初始化的操作。 ClassLoader cl = new ClassLoader(); cl.loadClass("com.mysql.jdbc.Driver"); //只加载类

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧