创建运行时类的对象

通过Class类构造实例

如果有一个Class类型的对象,可以用它newInstance方法构造一个实例。

public static void main(String[] args) throws IllegalAccessException, InstantiationException {
    Class eClass = Employee.class;
    Employee employee = (Employee) eClass.newInstance();
}

该方法返回的是一个Object对象,可使用强制转换成需要的对象。获取使用泛型

Class<Employee> eClass = Employee.class;
Employee employee = eClass.newInstance();

使用该方法构造类实例有两个要求:

  • 运行时类必须有空参构造器
  • 空参构造器的权限必须可见(一般设置为public)

空参构造器的作用

在使用反射创建运行时的类的实例时,绝大部分都是使用上述方法来创建,然后再通过实例方法来设置相应的属性,所以该类就需要提供一个空参构造器。

除此之外,便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器。

注意:JavaBean要求必须提供一个pubic的空参构造器

通过Constructor类构造实例

对于含参数的构造器,就不能通过上述方法来构建实例了,需要用Constructor类实例来创建运行时类的实例。

获取Constructor

通过Class实例获取Constructor的方法如下:

  • getConstructor(Class...):获取某个publicConstructor
  • getDeclaredConstructor(Class...):获取某个Constructor
  • getConstructors():获取所有publicConstructor
  • getDeclaredConstructors():获取所有Constructor

注意Constructor总是当前类定义的构造方法,和父类无关,因此不存在多态的问题。

Constructor常用方法如下:

  • getName()
  • getModifiers()
  • getParameterTypes()

下面展示获取一个类所有构造器方法的程序

private static void getContructorInfo (Class cl)
{
    Constructor[] cons = cl.getDeclaredConstructors();

    for (Constructor c:cons)
    {
        String m = Modifier.toString(c.getModifiers());

        if (m.length() > 0) {
            m += " ";
        }

        System.out.print(m);
        System.out.print(c.getName() + " ");
        System.out.print("(");

        Class[] paramTypes = c.getParameterTypes();

        for (int i = 0; i < paramTypes.length; i ++)
        {
            if (i > 0) {
                System.out.print(", ");
            }

            System.out.print(paramTypes[i].getName());
        }

        System.out.println(");");
    }
}

通过Constructor构造实例

通过该方法除了能够调用非空参构造器外,还能调用private的构造器。但调用非publicConstructor时,必须首先通过setAccessible(true)设置允许访问。

注意:setAccessible(true)可能会失败。

void test3 () throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    Class cl = Person.class;

    Constructor constructor = cl.getConstructor(String.class, int.class);
    Person      james       = (Person) constructor.newInstance("James", 36);

    System.out.println(james);
}