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

Class.forName() 理解

    博客分类:
  • java
阅读更多

在网上查了一下有关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. Stringurl="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
  3. Stringuser="";
  4. Stringpsw="";
  5. Connectioncon=DriverManager.getConnection(url,user,psw);
  1. com.mysql.jdbc.Driverdriver=newcom.mysql.jdbc.Driver()
  2. Stringurl="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
  3. Stringuser="";
  4. Stringpsw="";
  5. Connectioncon=DriverManager.getConnection(url,user,psw);

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

分享到:
评论

相关推荐

    java中Class.forName方法的作用详解

    Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...

    class literal & instance.getClass() & Class.forName(String className)

    在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...

    在Java的反射中,Class.forName和Class

    在Java的反射机制中,`Class.forName`和`ClassLoader`都是关键组件,它们在程序运行时动态加载类和实现类的实例化方面扮演着重要角色。理解这两个概念及其区别是深入掌握Java反射的重要一步。 首先,`Class.forName...

    class.forname的作用 详细解析抽象类和接口的区别

    然而,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。 了解抽象类 抽象类是指在面向对象领域中,用来表征我们在对问题领域进行分析、设计中...

    java中Class.forName的作用浅谈

    在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...

    注册驱动:Class.forName(xxx.Driver).xmind

    对SPI,理论联系实际的理解

    Class.forName()_newInstance()_New_三者区别

    在Java编程中,`Class.forName()`, `newInstance()` 和 `new` 关键字都是与对象创建和类加载紧密相关的概念,但它们各自有着不同的用途和限制。 首先,`Class.forName("className")` 是一个静态方法,它用于在运行...

    Classfor的用法

    ### Class.forName 的用法详解 #### 一、概述 `Class.forName` 是 Java 反射 API 中的一个重要方法,主要用于动态加载类...在实际开发中,正确地理解和使用 `Class.forName` 能够极大地提高程序的灵活性和可维护性。

    Java 类加载机制 ClassLoader Class.forName.pdf

    2. **通过`Class.forName()`方法动态加载**:可以在运行时动态地加载类。 3. **通过`ClassLoader.loadClass()`方法动态加载**:提供了更多的灵活性,可以根据不同的需求加载不同的类。 这三种方式各有特点,具体...

    White paper

    ### 动态加载Java类:理解`Class.forName`与扩展区中的挑战 #### 概述 在Java开发中,动态加载类的能力是其最强大的特性之一。通过在运行时仅根据类名加载代码,而无需在编译时知道确切的类名,开发者能够构建灵活...

    Java反射简单例子

    首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...

    Oracle驱动包(classes12、odbc14)

    对于JDBC,通常的URL格式是`jdbc:oracle:thin:@<hostname>:<port>:<service_name>`,其中`<hostname>`是Oracle服务器的IP地址,`<port>`是监听数据库连接的端口,`<service_name>`是Oracle服务名。对于ODBC,需要在...

    在可执行jar中载入第三方jar的几个解决方法

    这个问题通常发生在使用`Class.forName()`或`ClassLoader.getSystemClassLoader().loadClass()`尝试动态加载第三方JAR中的类时。 Java虚拟机(JVM)的类加载机制是导致此问题的关键。自JDK 1.2以来,JVM采用委托...

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

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

    dynamic-class.rar_自动创建类

    通过`Class.forName()`方法,可以加载指定名称的类。如果需要在运行时创建类,可能需要使用`java.lang.reflect.Proxy`或字节码操作库如ASM或ByteBuddy。例如,使用Proxy创建一个动态代理类: ```java interface ...

    数据库连接大全

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; ``` - **Class.forName**:加载指定的类。 - **newInstance()**:创建该类的新实例。 -...

    使用Java程序连接各种数据库的方法介绍

    Class.forName("oracle.jdbc.driver.OracleDriver"); ``` 然后设置数据库连接URL、用户名及密码: ```java String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 为数据库实例名 (SID) String user = ...

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

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

    JDBC连接各种数据代码.doc

    此外,随着JDBC 4.0及更高版本的引入,驱动自动加载功能(通过`service-provider`机制)使得不再需要手动调用`Class.forName()`来加载驱动。 总的来说,JDBC是Java开发中不可或缺的一部分,它为开发者提供了一种...

Global site tag (gtag.js) - Google Analytics