`
fqmly520
  • 浏览: 64635 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Class.forName(driverName);

阅读更多

Class.forName(driverName).newInstance();
Class.forName(driverName);
这二中方式有什么区别!

在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以写成如下形式:
String className = "Example";
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。

分享到:
评论

相关推荐

    JDBC访问数据库步骤

    加载驱动可以使用反射机制,例如使用 `Class.forName(String driverName)` 方法加载驱动。不同的数据库有不同的驱动,例如 Oracle、SQL Server、DB2、Informix、Sybase、MySQL、PostgreSQL 等。 步骤 2:创建连接 ...

    jdbc连接数据库大全[借鉴].pdf

    Class.forName(driverName); dbConn = DriverManager.getConnection(dbURL, userName, userPwd); ``` - **Sybase**: ```java Class.forName("com.sybase.jdbc.SybDriver"); String url = "jdbc:sybase:Tds:...

    JDBC连接各种数据库的方式

    Class.forName(driverName); Connection conn = DriverManager.getConnection(dbURL); if (conn != null) { System.out.println("连接成功!"); } else { System.out.println("连接失败!"); } conn.close()...

    Java连接数据库.docx

    Class.forName(driverName); // 注册驱动 Connection conn = DriverManager.getConnection(url, username, password); System.out.println("Connected to the database!"); // 执行SQL语句和其他操作... } ...

    sql sever 2005 jdbc

    Class.forName(driverName); System.out.println("加载驱动成功"); dbConn = DriverManager.getConnection(dbURL,userName,userPwd); System.out.println("连接数据库成功"); stat = dbConn.createStatement(); ...

    sql2000-JDBC驱动

    Class.forName(driverName); System.out.println("加载驱动成功"); dbConn = DriverManager.getConnection(dbURL,userName,userPwd); System.out.println("连接数据库成功"); stat = dbConn.createStatement();...

    数据库连接驱动.docx

    - 加载驱动:使用`Class.forName()`方法加载驱动类,例如`Class.forName("com.mysql.jdbc.Driver")`。这个方法会确保JVM能够找到并初始化指定的类,使得后续的数据库连接成为可能。 - 获取连接:使用`...

    数据库连接方式

    Class.forName("oracle.jdbc.driver.OracleDriver"); DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:a"); ``` #### 8. Access Microsoft Access虽然主要用于小型应用程序,但也可以通过JDBC进行...

    java 连接数据库sqlserver.doc

    Class.forName(driverName); Connection dbConn = DriverManager.getConnection(dbUrl, userName, userPwd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e....

    java 连接sql server数据库

    Class.forName(driverName); dbConn = DriverManager.getConnection(dbURL, userName, userPwd); System.out.println("Connection Successful!"); } catch (Exception e) { e.printStackTrace(); } } } ``` ...

    java连接网络SQLSERVER2000主法及错误处理

    Class.forName(driverName); Connection conn = DriverManager.getConnection(dbURL, userName, userPwd); System.out.println("Connection Successful!"); } catch (Exception e) { e.printStackTrace(); } ...

    java连接常用数据库示例

    Class.forName(driverName); dbConn = DriverManager.getConnection(dbURL, userName, userPwd); System.out.println("Connection Successful!"); } catch (Exception e) { e.printStackTrace(); } } } ```...

    JDBC操作数据库汇总

    - 或者使用`Class.forName().newInstance()`来实例化驱动类。 - 也可以直接使用`new DriverName()`,这种方式会在实例化时自动向`DriverManager`注册,因此无需再显式调用`DriverManager.registerDriver`方法。 2...

    jdbc学习文档

    Class.forName(driverName); // 获取数据库连接 Connection conn = DriverManager.getConnection(url, user, pwd); // ...其他操作 } catch (Exception e) { e.printStackTrace(); } } } ``` 通过这种...

    JDBC开发的接口和JDBC编程步骤

    - 方法一:`Class.forName(DriverName)`,其中`DriverName`是驱动的全限定类名。 - 方法二:`Class.forName(DriverName).newInstance()`,除了加载驱动,还创建了驱动的实例。 - 方法三:直接创建驱动的实例,如`...

    jdbc技术连接数据库

    Class.forName(driverName); ``` 2. **获取连接** - 加载完驱动之后,下一步是获取与数据库的实际连接。这通常通过 `DriverManager.getConnection()` 方法完成。 - 获取连接时需要指定数据库 URL、用户名和密码...

    Java使用JDBC连接数据库.docx

    - 使用 `DriverManager.registerDriver(Driver driver)` 或 `Class.forName("DriverName")` 来加载和注册数据库驱动。 - 示例:`Class.forName("com.hxtt.sql.access.AccessDriver");` 2. **通过 DriverManager ...

    Java连接数据库

    Class.forName(driverName); ``` 3. **连接数据库** 加载了驱动之后,可以使用`DriverManager.getConnection()`方法建立与数据库的连接。需要提供数据库的URL、用户名和密码。 ```java String dbURL = "jdbc...

    在Eclipse中用JDBC连接MySQL数据库!.txt

    - `Class.forName(driverName);`用于加载MySQL JDBC驱动。 - `getConnection()`方法用于建立数据库连接。 - 成功连接后会在控制台输出“Connection Successful!”。 #### 三、常见问题及解决方法 1. **连接失败...

    jdbc测试数据库是否连接成功

    Class.forName(driverName); Connection conn = DriverManager.getConnection(dbURL, userName, userPwd); System.out.println("连接成功"); // 输出提示信息表示连接成功 } catch (Exception e) { System.out....

Global site tag (gtag.js) - Google Analytics