反射操作构造方法:
通过以上我们知道可以使用反射机制操作类的结构,包括调用类的构造方法、操作类的普通方法、访问类的属性、取得类或者方法上注解信息等。
反射操作构造方法:
要使用反射操作构造方法,得先使用堆区的那个Class类对象取得构造方法的信息,构造方法的信息取得之后需要封装到一个对象中返回(到处都是面向对象的思想),这个保存了构造方法信息的对象是什么类型呢?在Java提供了一个类型专门描述构造方法,这个类型是“java.lang.reflect.Constructor”,就可以使用该类表示构造方法。但是如何取得这个表示构造方法的对象呢?使用堆区的Class类对象的方法:
public Constructor getConstructor(Class<?>… parameterTypes)
【根据构造方法的参数类型的Class类对象取得构造方法,该参数是一个可变参数,参数表示构造方法的参数类型的对应的Class类对象】
public Constructor<?>[] getConstructors() throws SecurityException
【返回所有的构造方法,这些构造方法保存到一个数组中返回】
package com.sxt.vo;
import java.io.Serializable;
import java.util.Date;
package com.sxt;
public class Test {
public static void main(String[] args) throws Exception {
//取得Emp堆区中的Class类对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//实例化Emp类对象
Emp emp=(Emp)empClass.newInstance();
System.out.println(emp);
}
}
public class Emp implements Serializable {
private Integer empno;
private String ename;
private String job;
private Double sal;
private Double comm;
private Integer mgr;
private Integer deptno;
private Date hierdate;
public Emp(Integer empno, String ename, String job, Double sal, Double comm, Integer mgr, Integer deptno, Date hierdate) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.sal = sal;
this.comm = comm;
this.mgr = mgr;
this.deptno = deptno;
this.hierdate = hierdate;
}
public Emp(Integer empno, String ename, String job, Double sal, Double comm, Integer mgr, Integer deptno) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.sal = sal;
this.comm = comm;
this.mgr = mgr;
this.deptno = deptno;
}
public Emp(Integer empno, String ename, String job, Double sal, Double comm, Integer mgr) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.sal = sal;
this.comm = comm;
this.mgr = mgr;
}
public Emp(Integer empno, String ename, String job, Double sal, Double comm) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.sal = sal;
this.comm = comm;
}
public Emp(Integer empno, String ename, String job, Double sal) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.sal = sal;
}
public Emp(Integer empno, String ename, String job) {
this.empno = empno;
this.ename = ename;
this.job = job;
}
public Emp(Integer empno, String ename) {
this.empno = empno;
this.ename = ename;
}
public Emp(Integer empno) {
this.empno = empno;
}
@Override
public String toString() {
return "Emp{" +
"empno=" + empno +
", ename='" + ename + '\'' +
", job='" + job + '\'' +
", sal=" + sal +
", comm=" + comm +
", mgr=" + mgr +
", deptno=" + deptno +
", hierdate=" + hierdate +
'}';
}
}
此时发现了没有找到无参数构造方法,所以我们知道使用newInstance()方法实例化对象的时候默认调用是无参数构造方法,因为我们为Emp提供了有参构造,就不会默认提供无参构造了,需要显示的定义出无参构造
提供无参构造:
public Emp() {
}
此时默认调用了无参数构造方法,那么如何去调用有参数构造呢? 如果要调用有参构造那么需要使用反射取得有参数构造方法。
取得所有的构造方法:
要取得构造方法,那么我们要知道表示构造方法的类是“java.lang.reflect.Constructor”,里面的方法:
public String getName():取得构造方法的名称
public int getParameterCount():返回构造方法参数的个数
package com.sxt;
import java.lang.reflect.Constructor;
public class Test {
public static void main(String[] args) throws Exception {
//取得Emp堆区中的Class类对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//取得所有的构造方法
Constructor<?> [] cons=empClass.getConstructors();
for(int i=0;i<cons.length;i++){
System.out.println(cons[i].getParameterCount());
}
}
}
以上取得是所有构造方法,如何取得指定的某个构造方法呢?
取得指定的某个构造方法:
package com.sxt;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
public class Test {
public static void main(String[] args) throws Exception {
//取得Emp堆区中的Class类对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//取得指定的构造方法
Constructor con1=empClass.getConstructor(Integer.class);
//使用该构造方法实例化对象
Emp emp1 =(Emp)con1.newInstance(1001);
System.out.println(emp1);
Constructor con2=empClass.getConstructor(Integer.class,String.class);
Emp emp2=(Emp)con2.newInstance(1002,"张三");
System.out.println(emp2);
Constructor con3=empClass.getConstructor(Integer.class,String.class,String.class);
Emp emp3=(Emp)con3.newInstance(1002,"李四","总裁");
System.out.println(emp3);
}
}
总结:
1、可以使用Class类对象的getConstructor()系列的方法取得构造方法对象
2、在反射中使用Constructor类表示构造方法。
3、getConstructor()只能取得类的public修饰的构造方法
构造方法