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

Class.forName( )你搞懂了吗?——转

    博客分类:
  • java
阅读更多
终于明白为什么加载数据库驱动只用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.
为了您的安全,请只打开来源可靠的网址
来自: http://hi.baidu.com/zxf1986518/blog/item/c5fac9cebbc33b32b600c849.html
分享到:
评论

相关推荐

    Java 反射(Reflection) 经典实用例子

    Class ownerClass = Class.forName(className) :首先得到这个类的Class。 Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。 Object property = field.get(ownerClass) :...

    JDBC——属性文件的用途之一

    1 Class.forName("com.mysql.jdbc.Driver"); 2 String url ="jdbc:mysql://localhost:3306/database0212"; 3 String uername = "root"; 4 String password = "123456"; conn = DriverManager.getConnection(url...

    Java——反射方法总结

    * Class Class.forName(String packageNameAndClassName); * Class 类的静态成员方法通过完整的包名.类名获取对应的.class文件的class对象 * 同时也可以作为.class文件加载的方式 * * Class 类名.class; * ...

    java开发实例——数据库查询

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:xueyuan"; Connection connection = DriverManager.getConnection(url); Statement statement = connection.createStatement(); ...

    mysql-connector-java-5.1.32.zip

    Class.forName("com.mysql.jdbc.Driver") ; /** * 解释: * ------- * jdbc:jdbc服务 * mysql:使用mysql的jdbc服务 * localhost:使用本地的mysql的jdbc服务 * 3306:使用本地的...

    学生成绩管理——c++.zip

    You need to design and implement a student manage system with follo wing functionalities: a) every student contains: id, name, password, gender, age, hometown. Students have four courses(Chinese, Math...

    串口通信——txt

    For Each port In ports ComboBox1.Items.Add(port) Next ComboBox1.Text = ComboBox1.Items(0) ComboBox2.Items.Add(1200) ComboBox2.Items.Add(4800) ComboBox2.Items.Add(9600) ComboBox2.Text = ...

    数据库接口解释类包解释

    在使用上面的方法之前,需要先在DriverManager类中注册JDBC数据库驱动程序,一般使用的方法为Class.forname(“Driver name”)。在注册之前,需要先把数据库驱动程序的路径添加到classpath中,对于Jbuilder来说,就是...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    BlazeDS 将首先创建 FlexFactory 的实例—— FlexFactoryImpl; 当接收到 Flex 前端的远程调用请求时,BlazeDS 通过 FlexFactory 创建 FactoryInstance 对象,并传入请求的 Service ID。在这个应用程序中,被创建...

    java笔试题算法-Multi-threading:多线程

    ——————————————————————— THREAD CLASS METHODS ———————————————————— public void start(): START A THREAD BY CALLING ITS run() METHOD public void run(): ENTRY ...

    使用JMeter对ZK性能测试时需要安装的插件

    For security reasons, ZK generates ID randomly. However to perform a record & reply test, it is mandatory to fix the IDs of the components. The IdGenerator here is used to create a predictable ...

    在vue中给列表中的奇数行添加class的实现方法

    <li class=list-item v-for=(item,index) class={ xss=removed>{{data[index].name}} 奇数行::class=”{‘active’:index%2 != 1}” 偶数行::class=”{‘active’:index%2 != 0}” active是需要添加的class 以上...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    (每分钟 90 转),当前传动装置是第 5 个齿轮。再面向对象的程序设计中,这些数据应放在 变量中。自行车的行为:刹车,改变步度和换档。在面向对象的程序设计中,这些行为用方 法实现。 在 OOP 技术中,对象充当了...

    Lucene中文分词组件 JE-Analysis 1.4.0

    doc.add(new Field(fieldName, text, Field.Store.YES, Field.Index.TOKENIZED)); iwriter.addDocument(doc); iwriter.close(); IndexSearcher isearcher = new IndexSearcher(directory); QueryParser ...

    [php]mysql数据库操作——DB类

    class mysql{ private $host; // 数据库主机 private $user; // 数据库用户名 private $pass; // 数据库密码 private $data; // 数据库名 private $conn; // 数据库连接标识 private $sql; // sql语句 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    10.5.3 instanceof运算符——让对象告诉你它的类是谁 286 10.6 小结:继承和多态让世界丰富多彩 287 10.7 习题 290 第11章 修饰符(Qualifier) 291 教学视频:26分钟 11.1 插曲:类的组成部分的名字 291 11.2...

    Java解惑(谜题)CHM中英文双版本

    谜题77:搞乱锁的妖怪 谜题78:反射的污染 谜题79:这是狗的生活 谜题80:更深层的反射 谜题81:烧焦(字符化)到无法识别 谜题82:啤酒爆炸 谜题83:诵读困难者的一神论 谜题84:被粗暴地中断 谜题85:惰性...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    10.5.3 instanceof运算符——让对象告诉你它的类是谁 286 10.6 小结:继承和多态让世界丰富多彩 287 10.7 习题 290 第11章 修饰符(Qualifier) 291 教学视频:26分钟 11.1 插曲:类的组成部分的名字 291 11.2...

    图库新版jQuery焦点图 JS代码

    不懂web技术能策划网站么?'; tips[6] = '只有那些符合用户需求的技术才有意义,尊重人比尊重科学更重要,不要迷信“科学”。'; tips[7] = '说服别人之前,先说服自己。每个步骤都要有为什么,弄不明白先去问搜索...

    jpivot学习总结.doc

    解压jpivot.war 文件,在你的应用当中你需要下面的这些文件: /wcf/** /jpivot/** /WEB-INF/wcf/** /WEB-INF/jpivot/** /WEB-INF/lib/** 最后你还需要对比 jpivot.war 里的 web.xml 文件去修改你自己的 web....

Global site tag (gtag.js) - Google Analytics