通过反射创建新的类示例,有两种方式:
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(调用者):
import java.lang.reflect.Constructor;
import static java.lang.System.out;
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()。
本文来自CSDN博客:http://blog.csdn.net/fenglibing/archive/2009/09/08/4531033.aspx
分享到:
相关推荐
richfaces_erro 正在建立中 调试当中 严重: Cant instantiate class: org.ajax4jsf.application.AjaxStateManager. java.lang.reflect.... at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
只有两个类拥有 newInstance() 方法,分别是 Class 类和 Constructor 类。Class 类中的 newInstance() 方法是不带参数的,而 Constructor 类中的 newInstance() 方法是带参数的。 构造无参实例 ------------- 可以...
在反射机制中,创建对象实例主要依赖于两种方法:`Class`类的`newInstance()`方法和`Constructor`类的`newInstance()`方法。 #### 通过Class实例化对象 当一个类被加载到JVM中时,会创建一个`Class`对象表示这个类...
此时可以使用 `Class.getDeclaredConstructor` 和 `Constructor.newInstance` 方法来解决。 #### 五、Class.forName 与 类加载器 在 Java 中,类是由类加载器负责加载到 JVM 中的。`Class.forName` 方法可以通过...
在上述代码中,`Class.forName()`用于加载类,`getConstructor()`和`newInstance()`用于获取并实例化对象,`getMethod()`和`invoke()`用于调用方法。 **简单工厂模式** 简单工厂模式是一种创建型设计模式,它定义了...
通过`Constructor`类的`newInstance()`方法可以创建对象,即使构造器是私有的。例如: ```java Constructor<User> constructor = User.class.getDeclaredConstructor(); constructor.setAccessible(true); User ...
4. 对象的创建:反射可以动态创建类的实例,使用`Class.newInstance()`或`Constructor.newInstance()`方法。 5. 访问字段和方法:反射允许程序在运行时访问类的私有字段和方法,通过`Field`和`Method`对象来实现。 ...
java反射的用例代码 // //获取类对象的属性 // Field field = clazz.getDeclaredField("name");...// Object instance = constructor.newInstance(new Object[]{1, "李四", "中国"}); // System.out.println(instance);
public Object newInstance(String className, Object[] args) throws Exception { Class newoneClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = ...
Object instance1 = constructor.newInstance(); Object instance2 = constructor.newInstance(); ``` 在`ParamClass.java`中,可能会定义一个类,其中包含一些参数化的构造器或方法。通过反射,我们可以动态传递...
`Class`对象提供了`newInstance()`方法,它会调用类的无参构造器来创建对象。首先需要获取类的`Class`对象,然后调用`newInstance()`: ```java Class<Person> clazz = Person.class; Person person = clazz.new...
2. 创建对象:使用`Class.newInstance()`(要求类有无参构造器)或`Constructor.newInstance()`(传入构造参数)。 3. 访问字段:`Field field = Class.getDeclaredField("字段名");`,然后`field.set(object, value...
2. **运行时构造任意类的对象**:使用`Class.newInstance()`或`Constructor.newInstance()`方法可以创建指定类的实例。 3. **获取类的成员变量和方法**:通过`Class.getDeclaredFields()`、`Class....
- `Object o = c.newInstance();`: 调用无参构造器创建对象。如果类没有无参构造器,会抛出异常。 访问属性: - `Field[] fs = c.getDeclaredFields();`: 获取所有属性,包括私有属性和继承的属性。 - `Field ...
假设我们已经得到了T的实际类型,我们可以使用`Class.newInstance()`方法或`Constructor.newInstance()`来创建对象。但要注意,`Class.newInstance()`方法要求类必须有无参构造器,而`Constructor.newInstance()`则...
2. 对象实例化:反射提供了一种在运行时创建对象的方式,通过`Class.newInstance()` 或 `Constructor.newInstance()` 创建对象,即使我们不知道确切的类名。 3. 构造器(Constructor):`Constructor` 类代表类的...
- `Constructor<T>.newInstance(Object... args)`通过指定的构造器参数创建对象。 6. 访问和修改字段: - `Field.get(Object obj)`获取指定对象的字段值。 - `Field.set(Object obj, Object value)`设置指定对象...
Class<?> arrayClass = Array.newInstance(Integer.class, 10).getClass(); ``` 5. **接口与注解的反射** - 反射可以检查类是否实现了某个接口,也可以获取类上的注解信息。 - 检查接口实现: ```java if ...
String str = (String) constructor.newInstance("Hello World"); ``` ##### Method `Method`类表示类的方法。可以通过`Class`对象获取方法,并通过`invoke()`方法调用。 ```java Class<?> clazz = Class.forName...