创建运行时类的对象
通过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...)
:获取某个public
的Constructor
;getDeclaredConstructor(Class...)
:获取某个Constructor
;getConstructors()
:获取所有public
的Constructor
;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的构造器。但调用非public
的Constructor
时,必须首先通过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);
}