在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。

这里有必要提一下就是Class下的newInstance()和new有什么区别?,首先,newInstance( )是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制。 
   好,到此为止,我们总结如下: 
   Class.forName("")返回的是类 
   Class.forName("").newInstance()返回的是object 
   有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢?
   刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码 段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的 Driver类的代码都必须类似如下:
  public class MyJDBCDriver implements Driver {
   static {
     DriverManager.registerDriver(new MyJDBCDriver());
  }
  }
 既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。
贴出Proxool 连接池的静态初始化方法:
public class ProxoolDriver implements Driver {

private static final Log LOG = LogFactory.getLog(ProxoolDriver.class);

static {
        try {
            DriverManager.registerDriver(new ProxoolDriver());
        } catch (SQLException e) {
            System.out.println(e.toString());
        }
    }

}
引用:http://www.cnblogs.com/shosky/archive/2011/07/22/2114290.html

转载于:https://www.cnblogs.com/civilofficer/archive/2013/01/11/civilofficer.html

Class.forName()、Class.forName().newInstance() 、New 三者区别!相关推荐

  1. java forname 原理_Java Class.forName()用法和newInstance()方法原理解析

    Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说 ...

  2. Class.forName()、Class.class、getClass() 区别

    问:简单谈谈你对 Java 中 Class.forName().Class.class.getClass() 三者的理解? Class.class 的形式会使 JVM 将使用类装载器将类装入内存(前提 ...

  3. java new newinstance_Java中newInstance()和new()区别

    一.newInstance()和new()区别: 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类: newInstance创建类是这个类必须已经加载过且已经连接,new创建类是 ...

  4. Java 之String、StringBuffer 和 StringBuilder 三者区别介绍

    String:字符串常量,字符串长度不可变,StringBuffer:字符串变量(Synchronized,即线程安全),StringBuilder:字符串变量(非线程安全). String Stri ...

  5. C# 总结const、 readonly、 static三者区别:

    总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...

  6. JavaScript中String的slice(),substr(),substring()三者区别

    JavaScript中String的slice(),substr(),substring()三者区别 共同之处 从给定的字符串中截取片段,并返回全新的这片段的字符串对象,且不会改动原字符串. 具体不同 ...

  7. 【C++容器】数组和vector、array三者区别和联系

    目录 一.数组 二.向量vector 三.数组与vector的对比 array和vector,数组三者区别和联系 共同点 不同点 作者:bandaoyu,本文不断更新,源文:https://blog. ...

  8. 互联网(internet)、因特网(Internet)、万维网(World Wide Web)三者区别

    互联网(internet).因特网(Internet).万维网(World Wide Web)三者区别 计算机网络 互连网 互联网 因特网 万维网 万维网与超文本系统 三者联系 计算机网络 简称网络. ...

  9. xposed、frida、以及平头哥框架三者区别

    文章目录 一.Xposed 二.Frida 三.平头哥(ratel)框架 四.三者区别(重点) 提示:以下是本篇文章正文内容,下面案例可供参考 一.Xposed Xposed 框架是一款可以在不修改 ...

  10. BVR、RV、BV电线三者区别

    BVR.RV.BV电线三者区别 个人学习用途博客 部分内容摘抄自网络

最新文章

  1. 关于Windows 7的64位系统不兼容某些控件的问题
  2. Sublime-text
  3. 修改anaconda3 jupyter notebook 默认路径
  4. linux中iptable中端口,Linux如何打开iptables中的端口
  5. Java笔试之Singleton
  6. 029——VUE中键盘语义修饰符
  7. [ 渗透工具篇 ] sqlmap 详解(一) sqlmap 安装详解
  8. 巨人肩膀_如何站在巨人的肩膀上
  9. 信创操作系统--统信UOS桌面版(软件管理:应用商店、包管理器)
  10. 过去式和过去分词的不规则列表
  11. 新买的移动硬盘不显示盘符?西部数据SSD无痛初始化指南
  12. delphi 水晶按钮
  13. 猜一宋词名句 Java_《宋词三百首》里的50个名句,最适合发朋友圈
  14. 保证只要看一遍,新手也能写出来的超简单五子棋代码
  15. spring框架多数据源切换问题的解决
  16. rrpp协议如何修改_华为交换机—RRPP协议
  17. 路漫漫其修远兮,吾将上下而求索--2019OKR规划
  18. 使用plugman开发cordova 高德地图定位插件
  19. Codeforces868F Yet Another MinimizationProblem
  20. PHP之流程控制(四)

热门文章

  1. shell 脚本创建虚拟机 并配置网卡ip地址(两个脚本)
  2. error while loading shared libraries: libconfig.so.8
  3. 使用 Sharding-Jdbc 实现分库分表、读写分离(未完待续)
  4. HDU1755 A Number Puzzle【全排列+暴力】
  5. SpringMVC请求后台地址URL没有.*的几种实现方式
  6. Java float型数据判断是否相等
  7. Linux下mail服务器应用之邮件系统的安全性
  8. 解决XP的IIS HTTP 500”内部服务器错误
  9. 创建student数据表_创建数据库、表和更改表
  10. 基于asp. net sql快餐外卖设计网站成品