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. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";   
  3. String user = "";   
  4. String psw = "";   
  5. Connection con = DriverManager.getConnection(url,user,psw);
  1. com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver()
  2. String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";   
  3. String user = "";   
  4. String psw = "";   
  5. Connection con = DriverManager.getConnection(url,user,psw);   

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值