- 浏览: 845829 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (379)
- struts (5)
- hibernate (16)
- spring (16)
- ssh (20)
- MySQL (16)
- 数据库脚本 (2)
- DownLoad (1)
- GAE (5)
- Java (103)
- LoadRunner (2)
- VF (1)
- 学习资料 (24)
- 软件使用 (21)
- 通信类 (4)
- 生活 (3)
- J2ME (1)
- 心理学 (1)
- Linux (26)
- Android (3)
- Oracle (1)
- 面向对象概念&面试准备 (11)
- ExtJs (2)
- Google Map (1)
- Flex (47)
- 算法研究 (1)
- share (20)
- python (1)
- MongoDB (7)
- centos6 (13)
- C++ (8)
- DB2 (3)
- C# (1)
- 代码片段 (24)
- Lucene (2)
- php (1)
- NodeJS (1)
- Express (1)
最新评论
-
shua1991:
已阅,我表示同意。
Eclipse统计代码行数 -
nakedou:
写的不错,挺详细的
在CentOS中使用 yum 安装MongoDB及服务器端配置 -
sjp524617477:
好方法
Eclipse统计代码行数 -
simpletrc:
<script>ale ...
Java写到.txt文件,如何实现换行 -
csdn_zuoqiang:
Apache Ftp Server,目前是1.0.4,非常好的 ...
Apache FtpServer在64位系统下服务不能启动解决方法
在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通常也不知其含义,通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )动态加载类是没有用的,其最终目的还是为了实例化对象。 而有一些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢? public class MyJDBCDriver implements Driver { 相关英文参考文献如下: 显然上面的一段话说明Class.forName()只是加载了类,并没有创建类的实例,要创建类的实例还是需要调用.newInstance()方法的。
Class下的newInstance()和new有什么区别?首先,newInstance( )是一个方法,而new是一个关键字,其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制。
好,到此为止,我们总结如下:
Class.forName("")返回的是类
Class.forName("").newInstance()返回的是object
有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);
刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
Java代码
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}
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.
评论
=================='A'类产品被被制造 ================== 洗衣机 ‘Washer-A’ 生产了 电冰箱 ‘Icebox-A’ 生产了 空调 ‘AirCondition-A’ 生产了 =================='B'类产品被被制造 ================== 洗衣机 ‘Washer-B’ 生产了 电冰箱 ‘Icebox-B’ 生产了 空调 ‘AirCondition-B’ 生产了 ================================================
package factory.abstract_factory.factory; public class Test { public static void main(String[] args) { try { Factory factoryA = new FactoryA(); Factory factoryB = new FactoryB(); System.out.println("=================='A'类产品被被制造 ==================\n"); factoryA.createWasher(); factoryA.createIcebox(); factoryA.createAirCondition(); System.out.println("\n=================='B'类产品被被制造 ==================\n"); factoryB.createWasher(); factoryB.createIcebox(); factoryB.createAirCondition(); System.out.println("\n================================================"); } catch (Exception e) { e.printStackTrace(); } } }
package factory.abstract_factory.factory; /** ************************************* * @Title ClassForNameTest.java * @Author 张作强 * @Date 2010-8-11 * @Comment Class.forName(className)动态加载 ************************************* */ public class ClassForNameTest { public static void main(String[] args) { ClassForNameTest ct = new ClassForNameTest(); System.out.println("=================='A'类产品被被制造 ==================\n"); ct.createAll("factory.abstract_factory.factory.FactoryA"); System.out.println("\n=================='B'类产品被被制造 ==================\n"); ct.createAll("factory.abstract_factory.factory.FactoryB"); System.out.println("\n================================================"); } void createAll(String className){ try { Factory ft = (Factory)Class.forName(className).newInstance(); ft.createWasher(); ft.createIcebox(); ft.createAirCondition(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
package factory.abstract_factory.factory; import factory.abstract_factory.products.AirCondition; import factory.abstract_factory.products.Icebox; import factory.abstract_factory.products.Washer; public abstract class Factory { public abstract Washer createWasher(); public abstract Icebox createIcebox(); public abstract AirCondition createAirCondition(); }
派生类(实现类):
package factory.abstract_factory.factory; import factory.abstract_factory.products.AirCondition; import factory.abstract_factory.products.AirConditionA; import factory.abstract_factory.products.Icebox; import factory.abstract_factory.products.IceboxA; import factory.abstract_factory.products.Washer; import factory.abstract_factory.products.WasherA; public class FactoryA extends Factory { public Washer createWasher() { return new WasherA(); } public Icebox createIcebox() { return new IceboxA(); } public AirCondition createAirCondition() { return new AirConditionA(); } }
package factory.abstract_factory.factory; import factory.abstract_factory.products.AirCondition; import factory.abstract_factory.products.AirConditionB; import factory.abstract_factory.products.Icebox; import factory.abstract_factory.products.IceboxB; import factory.abstract_factory.products.Washer; import factory.abstract_factory.products.WasherB; public class FactoryB extends Factory { public Washer createWasher() { return new WasherB(); } public Icebox createIcebox() { return new IceboxB(); } public AirCondition createAirCondition() { return new AirConditionB(); } }
测试类:
package factory.abstract_factory.factory; public class ClassForNameTest { public static void main(String[] args) { ClassForNameTest ct = new ClassForNameTest(); System.out.println("=================='A'类产品被被制造 ==================\n"); ct.showName("factory.abstract_factory.factory.FactoryA"); System.out.println("\n=================='B'类产品被被制造 ==================\n"); ct.showName("factory.abstract_factory.factory.FactoryB"); } void showName(String name){ try { Factory ft = (Factory)Class.forName(name).newInstance(); ft.createWasher(); ft.createIcebox(); ft.createAirCondition(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
发表评论
-
微信JS
2013-10-26 21:17 2098<div class="iteye-blog- ... -
ubuntu下MySQL用source命令导入sql文件出现乱码解决方法
2012-11-18 23:46 1576首先建立数据库的时候指明数据库编码如: CREA ... -
RandomAccessFile
2012-10-18 18:16 987public void run() { try { ... -
java中多种方式读文件
2012-10-18 16:53 987java中多种方式读文件一、多种方式读文件内容。1、按字节读取 ... -
FileChannelMain
2012-10-15 18:12 1118package scan; import java ... -
Apache FtpServer在64位系统下服务不能启动解决方法
2012-06-10 21:29 6925Apache FTPServer是一款用Java开发的 ... -
Java 集合类
2012-06-07 22:03 1803Java 集合类 1. 为什么要了解J ... -
short、int、long与byte之间的转换工具类
2012-05-31 11:05 4529/** * 各基础类型与byte之间的转换 * ... -
Linux Mint 13 配置JAVA 环境
2012-05-24 22:35 26650.1--下载 JAVA ... -
FatJar+Exe4j+Inno Setup 生成可执行的exe文件
2012-04-17 10:54 14661、fatjar 是Eclipse的一个免费的插件。它的 ... -
JPanel JTextField add Focus 获取焦点解决方案
2012-03-30 21:29 3025public class TabPagePanel ex ... -
JList List<E> Page 分页
2012-03-30 21:28 1767package view.retrieve.comps. ... -
JButton setAction的BUG
2012-03-23 10:53 1314今天在使用JButton的时候,想用setText()setI ... -
自定义JTabbedPane皮肤
2012-03-22 12:05 4742package ui; import java.awt. ... -
两个工具类
2012-03-17 21:27 899package com.retrieve.utils; ... -
两个工具类
2012-03-17 21:27 0package com.retrieve.utils; ... -
mysql、sqlserver、oracle分页,java分页统一接口实现
2012-03-13 17:56 0定义: pageStart 起始页,pageEnd 终止页, ... -
Invalid command: InetLoad::load
2012-03-06 16:41 1376Invalid command: InetLoad::load ... -
NIO: High Performance File Copying
2012-03-01 17:25 1209In a previous tip, I discussed ... -
自定义JList
2012-02-03 15:39 806自定义JList。
相关推荐
此外,`Class.forName()`方法还有其他重载形式,如`forName(String className, boolean initialize, ClassLoader loader)`,它允许你控制是否初始化类以及使用哪个类加载器进行加载。 总的来说,`Class.forName()`...
我们可以使用class literal来获取类的元数据,如类名、接口实现、父类等,也可以用于创建类的新实例(通过`newInstance()`方法,前提是该类有无参构造器)。 接着,我们讨论 "instance.getClass()"。这个方法是每个...
Class.forName()方法的用法可以分为两种,一种是使用Class.forName()方法加载类,然后使用newInstance()方法实例化该类,另一种是使用new关键字实例化类。两种方法的效果是一样的,但是它们的实现机制不同。Class....
所以,`Class.forName("").newInstance()` 通常结合使用,先加载类,然后创建类的实例。然而,如果你知道类的具体类型,直接使用 `new` 关键字创建对象会更常见且灵活,因为它可以调用任何公开的构造器。 `new` ...
在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...
`Class.forName` 经常与 `newInstance` 方法配合使用,以实现动态创建对象的目的。`newInstance` 方法用于创建 `Class` 对象所表示的类的实例。 **示例**: ```java try { Class<?> clazz = Class.forName(...
并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 为数据库SID String user = "test"; String password = "test"; ...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...
首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数是完全限定类名(包括包名),然后返回对应类的`Class`对象。一旦我们有了`Class`对象,就可以调用其方法来创建实例、获取字段和...
Class.forName(driver).newInstance(); Connection con = DriverManager.getConnection(url); Statement stm = con.createStatement(); String sql = "select * from sheet"; for(int i=0;i;i++){ ResultSet ...
access jar驱动连接数据库
例如,`A a = (A) Class.forName("pacage.A").newInstance();` 就是使用 newInstance() 方法创建了一个 A 类的对象。newInstance() 方法的作用是加载一个类,并创建一个新的对象。 从本质上讲,new 关键字和 new...
mysql4.1.10的JDBC驱动 把它拷贝到你的web应用的WEB-INF\lib下(当然也可以设置CLASSPATH) <br>接着修改程序代码: 将你的: Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 改为: ...
加载驱动可以使用反射机制,例如使用 `Class.forName(String driverName)` 方法加载驱动。不同的数据库有不同的驱动,例如 Oracle、SQL Server、DB2、Informix、Sybase、MySQL、PostgreSQL 等。 步骤 2:创建连接 ...
首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...
Class.forName(Driver).newInstance(); // 加载驱动 Connection con = DriverManager.getConnection(URL, Username, Password); // 获取连接 ``` 2. Microsoft SQL Server数据库连接: SQL Server提供了两种连接...
在使用JDBC时,首先需要加载数据库驱动,这通常通过`Class.forName()`方法完成,然后创建数据库连接。以下是不同类型的数据库使用JDBC连接的一些示例: 1. **Oracle数据库(thin模式)**: ```java Class.forName...
- Oracle:`Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()` - SQL Server:`Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance()` - DB2:`Class.forName(...