`

newInstance() 的参数版本与无参数版本详解

 
阅读更多
通过反射创建新的类示例,有两种方式:
Class.newInstance()
Constructor.newInstance()

以下对两种调用方式给以比较说明:
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

Class.newInstance() 抛出所有由被调用构造函数抛出的异常。

Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;
Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。

Class A(被调用的示例):
public class A {
	private A() {
		System.out.println("A's constructor is called.");
	}

	private A(int a, int b) {
		System.out.println("a:" + a + " b:" + b);
	}
}

Class B(调用者):
public class B { 
	public static void main(String[] args) { 
		B b=new B(); 
		out.println("通过Class.NewInstance()调用私有构造函数:"); 
		b.newInstanceByClassNewInstance(); 
		out.println("通过Constructor.newInstance()调用私有构造函数:"); 
		b.newInstanceByConstructorNewInstance(); 
	} 
	/*通过Class.NewInstance()创建新的类示例*/ 
	private void newInstanceByClassNewInstance(){ 
		try {/*当前包名为reflect,必须使用全路径*/ 
			A a=(A)Class.forName("reflect.A").newInstance(); 
		} catch (Exception e) { 
			out.println("通过Class.NewInstance()调用私有构造函数【失败】"); 
		}
	}
	
	/*通过Constructor.newInstance()创建新的类示例*/ 
	private void newInstanceByConstructorNewInstance(){ 
		try {/*可以使用相对路径,同一个包中可以不用带包路径*/ 
			Class c=Class.forName("A"); 
			/*以下调用无参的、私有构造函数*/ 
			Constructor c0=c.getDeclaredConstructor(); 
			c0.setAccessible(true); 
			A a0=(A)c0.newInstance(); 
			/*以下调用带参的、私有构造函数*/ 
			Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class}); 
			c1.setAccessible(true); 
			A a1=(A)c1.newInstance(new Object[]{5,6}); 
		} catch (Exception e) { 
			e.printStackTrace(); 
		} 
	} 
}

输入结果如下:
通过Class.NewInstance()调用私有构造函数:
通过Class.NewInstance()调用私有构造函数【失败】
通过Constructor.newInstance()调用私有构造函数:
A's constructor is called.
a:5 b:6

说明方法newInstanceByClassNewInstance调用失败,而方法newInstanceByConstructorNewInstance则调用成功。
如果被调用的类的构造函数为默认的构造函数,采用Class.newInstance()则是比较好的选择,
一句代码就OK;如果是老百姓调用被调用的类带参构造函数、私有构造函数,
就需要采用Constractor.newInstance(),两种情况视使用情况而定。
不过Java Totorial中推荐采用Constractor.newInstance()。
分享到:
评论

相关推荐

    JDBC连接数据库各种数据库参数大全

    ### JDBC连接数据库各种数据库参数详解 #### 一、Oracle8/8i/9i数据库(thin模式) 在Java中通过JDBC访问Oracle数据库时,通常采用thin驱动方式。thin驱动是一种纯Java驱动,无需依赖任何非Java代码即可完成与...

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

    Java中new的用法[参考].pdf

    * 使用 newInstance() 方法创建对象:例如 `factory = (ExampleInterface)Class.forName("Example").newInstance();` 两种方式的主要区别在于创建对象的方式不一样。new 关键字是使用类加载机制,而 newInstance() ...

    java_数据库连接池_c3p0_使用及参数详解_支持重连

    ### Java 数据库连接池 C3P0 使用及参数详解(支持重连) #### 概述 C3P0 是一个开源的 J2EE 兼容的数据库连接池,由 mChange Computing Corporation 开发和维护。它能有效地管理数据库连接资源,提供高性能、可...

    Java中new的用法.doc

    #### 四、new与newInstance的区别 - **new关键字**: - 直接创建一个新的对象实例。 - 不需要类的加载器参与。 - **newInstance方法**: - 属于`java.lang.Class`类的方法。 - 需要在运行时通过类的完全限定名来...

    java反射详解

    通常情况下,我们可以通过`Class`对象的`newInstance()`方法来创建一个新实例,但前提是该类必须有一个无参构造函数。 ```java Class<?> clazz = Class.forName("Reflect.Person"); Person person = (Person) clazz...

    java反射详解1

    parameterTypes)`:获取指定参数类型的构造器,然后调用`newInstance(Object... initargs)`创建对象。 - `Constructor[] getConstructors()`:获取所有的公共构造器。 - `Constructor[] getDeclaredConstructors()`...

    C#+ArcEngine连接ArcSDE数据库参数设置

    Instance参数是指ArcSDE服务实例的名称,在本例中为“esri_sde”。如果是在本地服务器上,则可以直接使用实例名称;如果是远程服务器,则需要指定完整的服务器地址加上实例名称。 #### 2.3 Database Database参数...

    C#事件与委托详解

    ### C#事件与委托详解 #### 一、委托(Delegate) **委托**是C#语言中一种非常重要的机制,用于封装方法的引用。通过委托,我们可以在程序运行时动态地调用方法,这对于构建灵活的应用程序至关重要。 ##### 委托的...

    java 反射机制详解

    然后,`newInstance()` 方法用来创建该类的新实例。接着,通过 `getMethod()` 获取指定的设置字段的方法(在这里是 `setName`),并传入参数类型来指定方法签名。最后,`invoke()` 方法被用来执行这个方法,将参数值...

    java反射原理详解

    5. **创建实例**:`Class`对象的`newInstance()`方法用于创建类的新实例,前提是类有默认构造器。如果需要调用特定构造器,可使用`Constructor`类的`getConstructor()`和`newInstance()`方法。 6. **接口实现与动态...

    详解Ruby中的instance_eval方法及其与class_eval的对比

    `instance_exec` 是 `instance_eval` 的变体,它与 `instance_eval` 类似,但是它允许你在执行代码块时传递额外的参数。这些参数在代码块中作为局部变量可用。 ```ruby class C def initialize @x = 1 end end ...

    Java 反射详解

    `newInstance()`方法可以实现这一功能,但需要注意的是,该方法要求类必须有一个无参构造器。 3. 获取类信息:Class对象提供了丰富的API,如获取类名(`getName()`)、父类(`getSuperclass()`)、接口(`getInterfaces()...

    Java反射机制详解

    反射机制允许我们动态地创建对象,通过`Class`对象的`newInstance()`方法(要求类有无参构造器)或`Constructor`对象的`newInstance()`方法(可以指定构造器参数)。 4. **访问字段** `Field`对象可以用来获取和...

    Java 反射机制详解

    - `newInstance()`:通过无参构造器创建类的新实例。 - `getConstructor()`/`getDeclaredConstructor()`:获取指定参数类型的构造器。 - `getMethod()`/`getDeclaredMethod()`:获取指定名称和参数类型的方法。 ...

    Java访问SQLServer数据库配置及使用方法详解

    - `newInstance()`调用是为了兼容某些早期驱动版本,现代JDBC驱动通常不需要显式调用此方法。 - `getConnection`方法接收数据库连接字符串、用户名和密码作为参数。 ### 总结 本文详细介绍了Java访问SQLServer...

    java 用泛型参数类型构造数组详解及实例

    在这个例子中,`creArray`方法接收一个泛型参数`T`,并使用`obj.getClass()`获取其实际类型,然后调用`Array.newInstance`创建数组。这样,即使`T`在编译时未知,我们也能在运行时根据实际传入的类型创建数组。在主...

    java反射机制详解

    对于私有的构造函数或者其他情况,则需要使用`getConstructor()`和`newInstance()`方法结合使用。 ##### 2. 调用方法 反射还支持动态调用类的方法。假设有一个`Method`对象`method`,可以通过调用`invoke()`方法来...

    java反射详解 fly

    - `newInstance()`: 通过无参数的构造器创建类的新实例。 - `getConstructor(Class<?>... parameterTypes)`:获取指定参数类型的构造器,然后通过`newInstance(Object... initargs)`创建对象。 5. **访问和修改...

Global site tag (gtag.js) - Google Analytics