Class.forName() 理解

在网上查了一下有关Class.forName(”X”)的资料,很多人都不理解数据库连接为什么要用到这个,自己做了一下总结。

Class.forName(“X”)返回与带有给定字符串名的类或接口相关联的Class对象。

调用此方法等效于:

Class.forName(className, true, currentLoader)

参数:

name - 所需类的完全限定名

initialize - 是否必须初始化类

currentLoader - 用于加载类的类加载器

调用forName(“X”)将导致命名为X的类被初始化。

 

Class.forName(“X”)

ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("X"); 的区别在于类是否被初始化。

只有执行clazz.newInstance();时才能够初始化类。

newInstance():创建此Class对象所表示的类的一个新实例。

 

看一下JDBC驱动的装载。
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbcurl");


当调用Class.forName("com.mysql.jdbc.Driver");是Driver已经被初始化并注册到DriverManager中。

 

看一下MySQL Driver的代码:

public class Driver extends NonRegisteringDriver
     implements java.sql.Driver
{

     public Driver()
         throws SQLException
     {
     }

     static
     {
         try
         {
             DriverManager.registerDriver(new Driver());
         }
         catch(SQLException E)
         {
             throw new RuntimeException("Can't register driver!");
         }
     }
}

 


改修JDBC驱动的装载
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("com.mysql.jdbc.Driver");
clazz.newInstance();
Connection conn = DriverManager.getConnection("jdbcurl");
同样可以执行。但是这样就多构造了一个com.mysql.jdbc.Driver实例。同Class.forName("com.mysql.jdbc.Driver").newInstance()是一样的。是没有任何意义的。

 

为什么要用Class.forName()呢?

  1. Class.forName("com.mysql.jdbc.Driver");
  2. Stringurl="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
  3. Stringuser="";
  4. Stringpsw="";
  5. Connectioncon=DriverManager.getConnection(url,user,psw);
  1. com.mysql.jdbc.Driverdriver=newcom.mysql.jdbc.Driver()
  2. Stringurl="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
  3. Stringuser="";
  4. Stringpsw="";
  5. Connectioncon=DriverManager.getConnection(url,user,psw);

使用new关键字时你得保证import了这个驱动类才行,而使用class.formname()时你只要保证引用了驱动的jar包就行了。
如果用new的话,当工程改变了数据库,你得修改.java文件和引入相应的驱动包。
而使用class.formname()时可以将驱动的类配置在xml文件中。加载驱动对象时修改xml和引入jar包就行了,就不需要大规模的改动整个代码了。