`
tochange
  • 浏览: 16343 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC中使用Class.forName("xxx")的意义

阅读更多

Class.forName方法介绍

在java.lang.Class中,有两个重载的forName方法,分别是:

  1. static Class<?>forName(String className),该方法等价于Class.forName(className, true, this.getClass().getClassLoader())
  2. static Class<?>forName(String className, boolean initialize,ClassLoader loader),其中3个参数分别表示:className - 所需类的完全限定名,initialize - 是否必须初始化类,loader - 用于加载类的类加载器。

forName方法的作用就是:
使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。给定一个类或接口的完全限定名,此方法会试图定位、加载和链接该类或接口。指定的类加载器用于加载该类或接口,如果参数loader 为 null,则该类通过引导类加载器加载。只有 initialize 参数为 true且以前未被初始化时,才初始化该类。

其他的都很容易懂,就是当第二个参数为true时,到底初始化的是什么呢?可以通过下面这个例子来了解:

 

[java] view plaincopy
  1. package wen.hui.test.forname;  
  2.   
  3. /** 
  4.  * @author whwang 
  5.  * 
  6.  */  
  7. public class TestClassForName {  
  8.   
  9.     public static void main(String[] args) throws ClassNotFoundException {  
  10.         (new TestClassForName()).loadClass();  
  11.     }  
  12.       
  13.     @SuppressWarnings("unchecked")  
  14.     public Class<Test> loadClass() throws ClassNotFoundException {  
  15. //      Class<Test> clazz = (Class<Test>) Class.forName("wen.hui.test.forname.Test");  
  16.         Class<Test> clazz = (Class<Test>) Class.forName("wen.hui.test.forname.Test"true, getClass().getClassLoader());  
  17.         return clazz;  
  18.     }  
  19.       
  20. }  
  21.   
  22. class Test {  
  23.       
  24.     static {  
  25.         System.err.println("类的静态初始化块");  
  26.     }  
  27.       
  28.     public Test() {  
  29.         System.err.println("实例化类");  
  30.     }  
  31.       
  32. }  

运行后,打印:类的静态初始化块

没错,Class.forName的第二个参数为true时,就是要求JVM在加载类后,初始化类的静态字段和静态块。

 

JDBC中使用Class.forName("xxx")的意义

在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过上面的介绍,已经了解了Class.forName()方法的作用就是为了动态加载类,并决定是否需要初始化类的静态部分,而在JDBC规范中明确要求Driver(数据库驱动)类必须向DriverManager注册自己。写到这里,相信大家都应该明白为什么在我们加载数据库驱动包的时候有的仅仅需要Class.forName(xxx);而有的需要Class.forName(xxx).newInstance()。

下面以MySQL为例子,来看看MySQL的com.mysql.jdbc.Driver类是怎么写的,MySQL的Driver类源码(5.x)

 

[java] view plaincopy
  1. public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
  2.     // ~ Static fields/initializers  
  3.     // ---------------------------------------------  
  4.   
  5.     //  
  6.     // Register ourselves with the DriverManager  
  7.     //  
  8.     static {  
  9.         try {  
  10.             java.sql.DriverManager.registerDriver(new Driver());  
  11.         } catch (SQLException E) {  
  12.             throw new RuntimeException("Can't register driver!");  
  13.         }  
  14.     }  
  15.   
  16.     // ~ Constructors  
  17.     // -----------------------------------------------------------  
  18.   
  19.     /** 
  20.      * Construct a new driver and register it with DriverManager 
  21.      *  
  22.      * @throws SQLException 
  23.      *             if a database error occurs. 
  24.      */  
  25.     public Driver() throws SQLException {  
  26.         // Required for Class.forName().newInstance()  
  27.     }  
  28. }  

在使用JDBC连接MySQL数据库时,使用Class.forName("com.mysql.jdbc.Driver")就是为了向DriverManager注册自己;当然使用Class.forName("com.mysql.jdbc.Driver").newInstance()当然也没错,只是没有必要,因为后者还会生成Driver类的实例,而这个是我们没有用的,没有必要创建它。如果在Driver类中那个static块里面的部分写在了构造方法中,那么就必须使用Class.forName("com.mysql.jdbc.Driver").newInstance()来向DriverManager注册了。

分享到:
评论

相关推荐

    注册驱动:Class.forName(xxx.Driver).xmind

    对SPI,理论联系实际的理解

    greenplum.jar 官方JDBC驱动

    Class.forName("com.pivotal.jdbc.GreenplumDriver"); Connection db = DriverManager .getConnection( "jdbc:pivotal:greenplum://xxx:5432;DatabaseName=core_db", "gpadmin", "gpadmin"); Statement st = db....

    JDBC详解HTML-JDBC.pp

    &lt;2&gt;.Class.forName(driver).newInstance() &lt;3&gt;.new driver() 2&gt;.取得数据库连接(Connect to the DataBase) &lt;1&gt;.用DriverManager取数据库连接 Connection cn = DriverManager.getConnection(url,uid,pwd); &lt;2&gt;....

    java连接SqlServer完整代码,工具类,jdbc

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //Driver是静态代码块,类加载了就执行,用registerDriver会二次注册 //DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.**...

    JDBC数据库操作乱码无缝过渡解决方案

    首先,你可以创建一个"xxx.properties"属性文件,并存在与环境路径中(xxx代表你的属性文件名)然后 在URL中直接指定这个属性文件名:"jdbc:proxy:xxx" 其次,你可以在URL最后跟上类似"?key=value&key=value……...

    FxDB_JavaSqlite3.zip

    java访问sqlite public class TestSqlite3 { ... Class.forName(Class_Name);// 加载驱动,连接sqlite的jdbc Connection connection=DriverManager.getConnection(DB_URL);//连接数据库zhou.db,不存在则创建

    Java 面试宝典

    10、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? .................................................................................................................................

    二十三种设计模式【PDF版】

    可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和...

    Activiti6.0教程例子下载

    6. ManagementService: ManagementService提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。 7. HistoryService: HistoryService用于获取正在...

    最新Java面试宝典pdf版

    25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作...

    Java面试笔试资料大全

    25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作...

    JAVA面试宝典2010

    25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作...

    Java面试宝典-经典

    25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作...

    Java面试宝典2012版

    25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的...

    java面试题大全(2012版)

    25、Class.forName的作用?为什么要用? 111 26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作...

    java面试宝典2012

    25、Class.forName的作用?为什么要用? 121 26、大数据量下的分页解决方法。 121 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 122 28、这段代码有什么不足之处? 123 29、说出数据连接池的工作...

Global site tag (gtag.js) - Google Analytics