`
liyanhui
  • 浏览: 350618 次
  • 性别: 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元数据——CLass类

    1. 通过 Class 的 forName(String name) 方法传入一个类的完整类路径,也可以获得Class 对象,但由于使用的是字符串,必须强制转换才可以获取泛型的Class的Class对象,并且你应该考虑到这个方法可能抛出的 ...

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    温习java反射,让你对反射有全新的认识(csdn)————程序.pdf

    `Class.forName()`是配置文件和注解配置反射操作的主要手段,大多数开发框架如Spring依赖这种方式。 接下来是反射实例化对象。一旦有了`Class`对象,我们就可以创建类的实例。`Class`类提供了`newInstance()`方法,...

    注册Jdbc驱动程序的三种方式

    首先,我们来看最传统的方式——使用`Class.forName()`方法。这种方法依赖于Java的反射机制。在运行时,`Class.forName()`会加载指定的类,并调用其实例的`static`初始化块。对于JDBC驱动来说,这个初始化块通常会...

    class——Java高级开发工程师必须懂得

    - **Class.forName()**: 使用字符串形式的类全名(包括包名),如`Class.forName("路径.包.类名")`,可以在运行时动态加载对应的`Class`对象。 2. **Java动态加载类**: - **静态加载类**: 当使用`new`关键字创建...

    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...

    Sqlserver2000,2005,Oracle10g,Mysql,DB2,AS400数据库驱动

    Java开发者使用Oracle数据库时,需下载ojdbc.jar,并通过JDBC驱动实现连接,如`Class.forName("oracle.jdbc.driver.OracleDriver")`。 3. MySQL: MySQL是一款开源、免费的数据库系统,适合中小型应用。其JDBC驱动...

    常用数据库JDBC连接写法

    Class.forName("oracle.jdbc.driver.OracleDriver"); Connection cn = DriverManager.getConnection("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", "username", "password"); ``` ### Sybase Sybase(现已...

    4种数据库JDBC连接jar包及连接字符串

    `Class.forName()`方法用于注册JDBC驱动,以便`DriverManager.getConnection()`可以找到并使用它建立数据库连接。 JDBC驱动jar包的引入对于Java开发者来说至关重要,它们使得Java程序能够与不同的数据库进行通信,...

    java中的反射机制

    `Class.forName()`方法需要传入完整的类路径,即包含包名和类名的字符串。 3. **通过对象获取** ```java String str = "Hello"; Class<?> c3 = str.getClass(); ``` 如果已经有一个对象实例,可以直接使用`...

    java学习——java中的反射学习笔记.rar_java 反射

    - 使用`Class.forName()`方法,传入完全限定类名。 - 调用任何对象的`getClass()`方法。 - 使用类的`class`关键字,如`MyClass.class`. 3. 创建对象:通过Class对象,可以使用`newInstance()`方法创建类的新实例...

    【技术分享】重逢——Java安全之反射 .pdf

    例如,`Class.forName()`方法用于根据类名加载对应的类,`Class.getMethod()`和`Class.getField()`用于获取类的方法和字段。 5. **举例说明反射重要性** 当JVM加载一个类时,如`String`类,会为这个类创建一个对应...

    jdbc数据库连接代码

    Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection conn = ...

    mysql连接——jdbc驱动

    2. **加载驱动**:使用`Class.forName()`方法加载JDBC驱动,例如`Class.forName("com.mysql.jdbc.Driver")`。 3. **建立连接**:使用`DriverManager.getConnection()`方法创建数据库连接,通常需要提供数据库URL、...

    ojdbc、musql、db2、sqlserver Jar包

    Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@hostname:port/service_name", "username", "password"); ``` 2. **MySQL**: MySQL...

    安卓Android源码——android 通过jdts.jar 连接SQLSEVER2008.rar

    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); String url = "jdbc:microsoft:sqlserver://<服务器地址>:<端口号>;DatabaseName=<数据库名>"; String username = "<用户名>"; String password = ...

    安卓Android源码——通过jdts.jar连接SQLSEVER2008.zip

    Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(DB_URL); } catch (Exception e) { e.printStackTrace(); } return conn; } } ``` 这里,`JDBC_DRIVER`是jdts.jar中的驱动类,`DB_URL`是...

    Java编程的动态性

    - **通过字符串类名**:使用`Class.forName(String name)`,如`Class.forName("java.lang.String")`。 ```java // 已知类名 Class<?> myClass = MyClass.class; // 通过字符串类名 Class<?> myClass2; try { ...

    mysql&oracle驱动jar包.rar

    2. 使用`Class.forName()`方法加载驱动,例如`Class.forName("com.mysql.cj.jdbc.Driver")`或`Class.forName("oracle.jdbc.driver.OracleDriver")`。 3. 使用`java.sql.DriverManager.getConnection()`方法建立...

Global site tag (gtag.js) - Google Analytics