Class.forName( )你搞懂了吗?——转
终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时!!希望我写的这个东西对各位有所帮助。

  
   在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);就可以了。

相关 英文参考文献如下:
we just want to load the driver to jvm only, but not need to user the instance of driver, so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(), the result will same as calling Class.forName(xxx.xx.xx), because Class.forName(xxx.xx.xx).newInstance() will load driver first, and then create instance, but the instacne you will never use in usual, so you need not to create it.

Class.forName( )你搞懂了吗?——转相关推荐

  1. 搞懂Java的反射机制

    搞懂Java的反射机制 1.什么是反射? java的反射机制是指可以在运行状态下获取类和对象的所有属性和方法. 2.反射的作用? 1.在运行时获取一个类/对象的成员变量和方法 2.在运行时创建一个类的 ...

  2. 一下子搞懂JDBC,看这篇就够了--以MySQL为例。

    一下子搞懂JDBC,看这篇就够了–以MySQL为例. 文章目录 一下子搞懂JDBC,看这篇就够了--以MySQL为例. 一.什么是JDBC? 二.JDBC的使用步骤 三.jdbc进阶--上述各个类或接 ...

  3. 手把手带你搞懂AMS启动原理

    彻底搞懂AMS即ActivityManagerService,看这一篇就够了 前言 最近那么多教学视频(特别是搞车载的)都在讲AMS,可能这也跟要快速启动一个app(甚至是提高安卓系统启动速度有关), ...

  4. 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)

    文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...

  5. 彻底搞懂java反射技术及其原理

    概述:反射是java中最强大的技术之一,很多高级框架都用到了反射技术,面试中也是经常问的点,所以搞懂反射非常重要! 文章目录 1.反射是什么? 2.反射的底层原理 3.三种方式获取Class对象 4. ...

  6. 彻底搞懂JDBC的运行过程

    前几天笔者发布了博客手写mybatis彻底搞懂框架原理.为了帮助初学者更好理解mybatis框架,这次讲解一下Java的JDBC的运行过程. JDBC的作用 JDBC的全称是Java DataBase ...

  7. zhs16gbk对应mysql_[Oracle] 彻底搞懂Oracle字符集

    基本概念字符集(Character set):是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.常见的字符集有ASCII,ZHS16GB231 ...

  8. 面试必备|带你彻底搞懂Python生成器

    2019年人工智能系统学: https://edu.csdn.net/topic/ai30?utm_source=ai100_bw 作者 | Rocky0429 转载自 Python空间(ID:Dev ...

  9. 20分钟教你搞懂Git!

    Git 是最流行的版本管理工具,也是程序员必备的技能之一.本文就来教你 20 分钟搞懂 Git! 以下为译文: 尽管每天你都会用到Git,但也有可能搞不懂它的工作原理.为什么Git可以管理版本?基本命 ...

最新文章

  1. Unity中如何计算带minimap的贴图资源的大小
  2. ios 使用gcd 显示倒计时
  3. Linux系统压缩及解压缩
  4. 配置jupyter-pytorch深度学习环境
  5. Rainbond 5.0正式发布, 支持对接管理已有Kubernetes集群...
  6. 应该怎样设计和开发软件
  7. 软件测试总结--02缺陷报告
  8. flume建立ElasticSearch索引时间的问题
  9. 百度迁徙 迁入人口和迁徙规模爬虫
  10. linux sz命令详解,Linux中rz命令和sz命令使用详解大全
  11. ocx注册以及检测(转)
  12. 【踩坑专栏】主机文件复制到虚拟机
  13. 车牌识别对于智慧城市的重要性
  14. 获取字符串首字母拼音
  15. vc++之windows api
  16. 五子棋 java 棋盘变大_【java求助!】我的五子棋棋盘怎么加边框~!!??
  17. 2020NISP一级(模拟题一)
  18. c语言实现多目标优化,MOPSO 多目标例子群优化算法
  19. 7 RRC Measurement -- 测量报告
  20. C#中接口(Interface)与抽象类(abstract)的区别

热门文章

  1. angularjs和mysql_AngularJS SQL
  2. java 拆分类_拆分或不拆分类(用Java)
  3. 2、使用 kubeadm 方式快速部署K8S集群
  4. 多模态理论张德禄_观点 | 多模态研究:认知语言学的新方法
  5. nbu oracle 冷备_NBU备份系统应用操作手册..doc
  6. python学生管理系统教学_Python项目:学生信息管理系统(完整版)
  7. java 句子拆分_java – 将段落拆分为单个句子.我在这里覆盖了所有的基地吗?
  8. mysql or的效率_Mysql比较exists与in以及or的效率分析
  9. 概要设计实例_多核片上系统(SoC)架构的嵌入式DSP软件设计
  10. 【c语言】蓝桥杯基础练习 01字串