`

Class.forName(name).newInstance()用法

    博客分类:
  • Java
阅读更多

在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类的代码都必须类似如下:


Java代码
public class MyJDBCDriver implements Driver {  
    static {  
      DriverManager.registerDriver(new MyJDBCDriver());  
    }  

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.

     显然上面的一段话说明Class.forName()只是加载了类,并没有创建类的实例,要创建类的实例还是需要调用.newInstance()方法的。

分享到:
评论
4 楼 csdn_zuoqiang 2010-08-11  
对于一致的结果,对比,两种方式:::

=================='A'类产品被被制造 ==================

洗衣机 ‘Washer-A’ 生产了
电冰箱 ‘Icebox-A’ 生产了
空调 ‘AirCondition-A’ 生产了

=================='B'类产品被被制造 ==================

洗衣机 ‘Washer-B’ 生产了
电冰箱 ‘Icebox-B’ 生产了
空调 ‘AirCondition-B’ 生产了

================================================
3 楼 csdn_zuoqiang 2010-08-11  
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();
		}
	}
}

2 楼 csdn_zuoqiang 2010-08-11  
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();
					}
				}
	}

1 楼 csdn_zuoqiang 2010-08-11  
抽象类(接口)
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();
					}
				}
	}



相关推荐

    Class.forName

    此外,`Class.forName()`方法还有其他重载形式,如`forName(String className, boolean initialize, ClassLoader loader)`,它允许你控制是否初始化类以及使用哪个类加载器进行加载。 总的来说,`Class.forName()`...

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

    我们可以使用class literal来获取类的元数据,如类名、接口实现、父类等,也可以用于创建类的新实例(通过`newInstance()`方法,前提是该类有无参构造器)。 接着,我们讨论 "instance.getClass()"。这个方法是每个...

    Java Class.forName()用法和newInstance()方法原理解析

    Class.forName()方法的用法可以分为两种,一种是使用Class.forName()方法加载类,然后使用newInstance()方法实例化该类,另一种是使用new关键字实例化类。两种方法的效果是一样的,但是它们的实现机制不同。Class....

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

    所以,`Class.forName("").newInstance()` 通常结合使用,先加载类,然后创建类的实例。然而,如果你知道类的具体类型,直接使用 `new` 关键字创建对象会更常见且灵活,因为它可以调用任何公开的构造器。 `new` ...

    java中Class.forName的作用浅谈

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

    jdbc驱动程序实例

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

    Classfor的用法

    `Class.forName` 经常与 `newInstance` 方法配合使用,以实现动态创建对象的目的。`newInstance` 方法用于创建 `Class` 对象所表示的类的实例。 **示例**: ```java try { Class<?> clazz = Class.forName(...

    liuwei1989#study-guide#17-Class.forName和classloader的区别1

    并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c

    java于各种数据库连接额语句

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

    jdbc笔记整理 sql

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //Sql Server7.0/2000 数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //DB2 数据库 Class.froName(...

    forname实现工程内部反射机制

    首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数是完全限定类名(包括包名),然后返回对应类的`Class`对象。一旦我们有了`Class`对象,就可以调用其方法来创建实例、获取字段和...

    excel的jdbc驱动

    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驱动连接数据库

    access jar驱动连接数据库

    new关键字和newInstance() 的区分

    例如,`A a = (A) Class.forName("pacage.A").newInstance();` 就是使用 newInstance() 方法创建了一个 A 类的对象。newInstance() 方法的作用是加载一个类,并创建一个新的对象。 从本质上讲,new 关键字和 new...

    mysql-connector-java-3.0.14-production-bin.jar

    mysql4.1.10的JDBC驱动 把它拷贝到你的web应用的WEB-INF\lib下(当然也可以设置CLASSPATH) <br>接着修改程序代码: 将你的: Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 改为: ...

    JDBC访问数据库步骤

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

    Java反射简单例子

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

    java平时最常用的7种数据库连接方式.docx

    Class.forName(Driver).newInstance(); // 加载驱动 Connection con = DriverManager.getConnection(URL, Username, Password); // 获取连接 ``` 2. Microsoft SQL Server数据库连接: SQL Server提供了两种连接...

    java数据库连数语法

    在使用JDBC时,首先需要加载数据库驱动,这通常通过`Class.forName()`方法完成,然后创建数据库连接。以下是不同类型的数据库使用JDBC连接的一些示例: 1. **Oracle数据库(thin模式)**: ```java Class.forName...

    使用JDBC连接各种数据库总结

    - Oracle:`Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()` - SQL Server:`Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance()` - DB2:`Class.forName(...

Global site tag (gtag.js) - Google Analytics