通过反射创建新的类示例,有两种方式:
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连接数据库各种数据库参数详解 #### 一、Oracle8/8i/9i数据库(thin模式) 在Java中通过JDBC访问Oracle数据库时,通常采用thin驱动方式。thin驱动是一种纯Java驱动,无需依赖任何非Java代码即可完成与...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl为数据库的SID String user = "test"; String password = "test"; Connection ...
* 使用 newInstance() 方法创建对象:例如 `factory = (ExampleInterface)Class.forName("Example").newInstance();` 两种方式的主要区别在于创建对象的方式不一样。new 关键字是使用类加载机制,而 newInstance() ...
### Java 数据库连接池 C3P0 使用及参数详解(支持重连) #### 概述 C3P0 是一个开源的 J2EE 兼容的数据库连接池,由 mChange Computing Corporation 开发和维护。它能有效地管理数据库连接资源,提供高性能、可...
#### 四、new与newInstance的区别 - **new关键字**: - 直接创建一个新的对象实例。 - 不需要类的加载器参与。 - **newInstance方法**: - 属于`java.lang.Class`类的方法。 - 需要在运行时通过类的完全限定名来...
通常情况下,我们可以通过`Class`对象的`newInstance()`方法来创建一个新实例,但前提是该类必须有一个无参构造函数。 ```java Class<?> clazz = Class.forName("Reflect.Person"); Person person = (Person) clazz...
parameterTypes)`:获取指定参数类型的构造器,然后调用`newInstance(Object... initargs)`创建对象。 - `Constructor[] getConstructors()`:获取所有的公共构造器。 - `Constructor[] getDeclaredConstructors()`...
Instance参数是指ArcSDE服务实例的名称,在本例中为“esri_sde”。如果是在本地服务器上,则可以直接使用实例名称;如果是远程服务器,则需要指定完整的服务器地址加上实例名称。 #### 2.3 Database Database参数...
### C#事件与委托详解 #### 一、委托(Delegate) **委托**是C#语言中一种非常重要的机制,用于封装方法的引用。通过委托,我们可以在程序运行时动态地调用方法,这对于构建灵活的应用程序至关重要。 ##### 委托的...
然后,`newInstance()` 方法用来创建该类的新实例。接着,通过 `getMethod()` 获取指定的设置字段的方法(在这里是 `setName`),并传入参数类型来指定方法签名。最后,`invoke()` 方法被用来执行这个方法,将参数值...
5. **创建实例**:`Class`对象的`newInstance()`方法用于创建类的新实例,前提是类有默认构造器。如果需要调用特定构造器,可使用`Constructor`类的`getConstructor()`和`newInstance()`方法。 6. **接口实现与动态...
`instance_exec` 是 `instance_eval` 的变体,它与 `instance_eval` 类似,但是它允许你在执行代码块时传递额外的参数。这些参数在代码块中作为局部变量可用。 ```ruby class C def initialize @x = 1 end end ...
`newInstance()`方法可以实现这一功能,但需要注意的是,该方法要求类必须有一个无参构造器。 3. 获取类信息:Class对象提供了丰富的API,如获取类名(`getName()`)、父类(`getSuperclass()`)、接口(`getInterfaces()...
反射机制允许我们动态地创建对象,通过`Class`对象的`newInstance()`方法(要求类有无参构造器)或`Constructor`对象的`newInstance()`方法(可以指定构造器参数)。 4. **访问字段** `Field`对象可以用来获取和...
- `newInstance()`:通过无参构造器创建类的新实例。 - `getConstructor()`/`getDeclaredConstructor()`:获取指定参数类型的构造器。 - `getMethod()`/`getDeclaredMethod()`:获取指定名称和参数类型的方法。 ...
- `newInstance()`调用是为了兼容某些早期驱动版本,现代JDBC驱动通常不需要显式调用此方法。 - `getConnection`方法接收数据库连接字符串、用户名和密码作为参数。 ### 总结 本文详细介绍了Java访问SQLServer...
在这个例子中,`creArray`方法接收一个泛型参数`T`,并使用`obj.getClass()`获取其实际类型,然后调用`Array.newInstance`创建数组。这样,即使`T`在编译时未知,我们也能在运行时根据实际传入的类型创建数组。在主...
对于私有的构造函数或者其他情况,则需要使用`getConstructor()`和`newInstance()`方法结合使用。 ##### 2. 调用方法 反射还支持动态调用类的方法。假设有一个`Method`对象`method`,可以通过调用`invoke()`方法来...
- `newInstance()`: 通过无参数的构造器创建类的新实例。 - `getConstructor(Class<?>... parameterTypes)`:获取指定参数类型的构造器,然后通过`newInstance(Object... initargs)`创建对象。 5. **访问和修改...