使用Class对象可以获取类定义的所有构造方法,获取的构造方法以Constructor类型的对象或数组方式返回,每个Constructor对象代表一个构造方法,利用Constructor提供的方法可以调用获取的构造方法来实例化类。
Class类定义了如下方法,用于访问类的构造方法。
● Constructor<T> getConstructor(Class<?>... parameterTypes)
该方法返回一个构造函数对象,该对象为由该类对象表示的类的指定公共构造函数。返回类型为Constructor类型。parameterTypes参数是一个类对象数组,它按声明的顺序标识构造函数的形式参数类型。如果参数为空,返回默认的构造方法。
● Constructor<?>[] getConstructor()
该方法返回一个数组,该数组包含反映该类对象所表示的类的所有公共构造函数的构造方法对象。如果类没有公共构造方法,则返回长度为0的数组。
● Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
该方法返回一个类的构造方法,返回类型为Constructor类型。parameterTypes参数是一个类对象数组,它按声明的顺序标识构造方法的形式参数类型。
● Constructor<?>[] getDeclaredConstructors()
该方法返回一个构造函数对象数组,该数组包含由该类对象表示的类声明的所有构造方法。这些是公共、受保护、默认(包)访问和私有构造方法。
案例1:建立Person类,定义成员变量name(姓名),age(年龄)、job(职业)、income(收入),定义无参和有参三个构造方法。建立ConstructorTest1测试类,获取指定参数类型的构造方法。
在PCoreUnit8项目新建constructor包,在constructor包下新建Person类。代码如下:
package constructor;
/**
* @ClassName: Person
* @Description: 反射(访问类的构造方法)案例
* @author 编程训练营
* @date
*
*/
public class Person {
// 姓名
String name;
// 年龄
int age;
// 职业
public String job;
// 收入
public double income;
// 无参构造函数(public权限)
public Person()
{
name = "";
age = 0;
job = "";
income = 0.0;
}
// 有参构造函数(public权限)
public Person(String name,int age)
{
this.name = name;
this.age = age;
job = "";
income = 0.0;
}
// 有参构造函数(protected权限)
protected Person(String name,int age,String job,double income)
{
this.name = name;
this.age = age;
this.job = job;
this.income = income;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the job
*/
public String getJob() {
return job;
}
/**
* @param job the job to set
*/
public void setJob(String job) {
this.job = job;
}
/**
* @return the income
*/
public double getIncome() {
return income;
}
/**
* @param income the income to set
*/
public void setIncome(double income) {
this.income = income;
}
/**
* 输出类成员变量的值
*/
public void showPerson()
{
System.out.println("name:" + this.name);
System.out.println("age:" + this.age);
System.out.println("job:" + this.job);
System.out.println("income:" + this.income);
}
}Person类定义了三个构造方法,其中两个构造方法是public访问权限,一个构造方法是protected访问权限,定义一个protected访问权限的构造方法,主要是区分Class类的getConstructor()和getDeclaredConstructor()方法的区别。
在constructor包下新建ConstructorTest1测试类。代码如下:
package constructor;
import java.lang.reflect.Constructor;
/**
* @ClassName: ConstructorTest1
* @Description: 反射(访问类的构造方法)案例1
* @author 编程训练营
* @date
*
*/
public class ConstructorTest1 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 获取Person类的Class对象
Class<?> personClass = (Class)Person.class;
try {
// 获取指定参数类型具有public权限的构造方法
Constructor paramConstructor1 = personClass.getConstructor(String.class, int.class);
System.out.println("通过class.getConstructor(args...)获取带参数的构造方法:" + paramConstructor1);
// 获取指定参数类型且对访问权限无限制的构造方法
Constructor paramConstructor2 = personClass.getDeclaredConstructor(String.class, int.class,String.class,double.class);
System.out.println("通过class.getDeclaredConstructor(args...)获取带参数的构造方法:" + paramConstructor2);
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}ConstructorTest1程序使用Class类的getConstructor()方法和getDeclaredConstructor()方法,来获取Person类的构造方法。这两个方法的区别是:getConstructor()方法获取该类的公共构造函数;getDeclaredConstructor可以获取类的公共、受保护、默认(包)访问和私有构造函数。两种方法传入的参数类型要和构造方法的参数类型一致,参数声明顺序也要相同。
getConstructor()和getDeclaredConstructor()方法会抛出NoSuchMethodException或SecurityException异常,因此程序需要对这两种异常进行处理。
Constructor类提供了对构造方法的操作,可以获取构造方法的相关信息,并可以通过获取的构造方法实例化类。Constructor类在java.lang.reflect包内,需要使用import语句导入Constructor类。
程序执行结果如下图所示:
案例2:建立ConstructorTest2测试类,获取Person类的所有构造方法。
在constructor包下新建ConstructorTest2测试类。代码如下:
package constructor;
import java.lang.reflect.Constructor;
/**
* @ClassName: ConstructorTest2
* @Description: 反射(访问类的构造方法)案例2
* @author 编程训练营
* @date
*
*/
public class ConstructorTest2 {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 获取Person类的Class对象
Class<?> personClass = (Class)Person.class;
//通过class.getConstructors()获取所有具有public权限的构造方法
Constructor[] constructors = personClass.getConstructors();
for (Constructor constructor : constructors) {
System.out.println("通过class.getConstructors()获取所有具有pubic权限的构造方法:" + constructor);
}
//通过class.getDeclaredConstructors获取所有构造方法
Constructor[] constructors1 = personClass.getDeclaredConstructors();
for (Constructor constructor : constructors1) {
System.out.println("通过class.getConstructors()获取所有构造方法:" + constructor);
}
}
}ConstructorTest2程序使用Class类的getConstructors()方法获取Person类具有类的公共构造方法,使用Class类的getDeclaredConstructors()方法获取Person类的所有构造方法,这两个方法返回Constructor类型的数组。
程序执行结果如下图所示:
