一、获取构造方法
借助Class类中某些方法可以获取对应类中声明的构造方法实例化对象
(1)Constructor[] getConstrutors()
返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组。
(2)Constructor getConstrutor(Class<?>… parameterTypes)
返回与返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象
①源代码
import java.lang.reflect.Constructor;
class Father{
public Father(){
}
}
class Student extends Father{
public Student() {
}//定义一个无参构造方法
public Student(String id) {
}//定义一个含String类型的参数的有参构造方法
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;
Constructor<?>[] constructors = clazz.getConstructors();
System.out.println(constructors.length);
System.out.println(constructors[0]);
System.out.println(constructors[1]);
Constructor<Student> constructor = clazz.getConstructor(String.class);
System.out.println(constructor);
}
}
②执行结果
③分析
①定义了一个Student类继承自Father类
②Father类中定义了一个无参构造方法
③Student类中中定义了一个无参构造方法和一个含String类型参数的有参构造方法
④通过getConstrutors()方法获得Student类中对应public构造方法所对应的Constructor数组
⑤由System.out.println(constructors.length);输出结果为2,说明getConstrutors()方法获得不到父类中的构造方法,也获取不到非public的构造方法
⑥通过getConstrutor()方法获得Student类中参数列表对应的public构造方法所对应的Constructor对象
(3)Constructor<?>[] getDeclaredConstructors()
返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组
(4)Constructor getDeclaredConstructor(Class<?>… parameterTypes)
返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。
①源代码
package test;
import java.lang.reflect.Constructor;
class Father{
public Father(){
}
}
class Student extends Father{
public Student() {
}
public Student(String id) {
}
private Student(int i) {
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
System.out.println(constructors.length);//打印结果有3个,说明能获取到访问权限为private的构造方法
System.out.println(constructors[0]);
System.out.println(constructors[1]);
System.out.println(constructors[2]);
Constructor<Student> constructor = clazz.getDeclaredConstructor(Integer.TYPE);
System.out.println(constructor);
}
}
②执行结果
③分析
与getConstrutors和getConstrutor方法不同的是:getDeclaredConstructors和getDeclaredConstructor方法不区分访问权限
注意:如果方法参数的数据类型为基本数据类型,则parameterType应为基本数据类型包装类.TYPE;如果方法参数的数据类型为基本数据类型包装类,则的数据类型应为包装类.class
二、操纵构造方法–获取构造方法信息
通过Constructor类某些方法可以获取某个构造方法的信息
(1)Class getDeclaringClass()
返回声明Constructor对象对应构造方法的类的Class对象。
(2)int getModifiers()
以整数形式返回Constructor对象表示的构造函数的修饰符。
(3)String getName()
以字符串形式返回Constructor对象所表示得构造方法的名称。
(4)Class<?>[] getParameterTypes()
返回由Constructor对象所表示的构造方法的参数列表类型对应Class对象组成的数组,如果构造方法没有参数,则数组长度为0。
(5)实现上述方法操纵构造方法
①源代码
package test;
import java.lang.reflect.Constructor;
class Father{
public Father(){
}
}
class Student extends Father{
public Student() {
}
public Student(String id) {
}
private Student(int i,String name) {
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;
Constructor<Student> constructor = clazz.getDeclaredConstructor(Integer.TYPE,String.class);
Class<Student> declaring = constructor.getDeclaringClass();
System.out.println(declaring);
int modifier = constructor.getModifiers();
System.out.println(modifier);
String name = constructor.getName();
System.out.println(name);
Class<?>[] pClass = constructor.getParameterTypes();
for (Class<?> class1 : pClass) {
System.out.println(class1);
}
}
}
②执行结果
三、操纵构造方法–创建对象
通过Constructor类某些方法可以创建对象
(1)void setAccessible(boolean flag)
调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
(2)T newInstance(Object… initargs)
使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象
initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组
①源代码
import java.lang.reflect.Constructor;
class Student{
private String name;
public Student() {
}
public Student(String name) {
this.name = name;//给全局变量赋值
}
public void doHomeWork() {
System.out.println(name+"正在做作业。。。。。");
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;//获取Class类实例化对象
Constructor<Student> constructor = clazz.getConstructor(String.class);//获取参数列表为String的构造方法
Student student = constructor.newInstance("小明");//创建构造方法所属的类的新对象,传入参数小明
student.doHomeWork();//student对象调用doHomeWork方法
}
}
②执行结果
四、创建对象的方式
(1)通过new关键词创建
①源代码
class Student{
private String name;
public Student() {
}
public Student(String name) {
this.name = name;//给全局变量赋值
}
public void doHomeWork() {
System.out.println(name+"正在做作业。。。。。");
}
}
public class Test {
public static void main(String[] args) throws Exception {
Student student = new Student("小强");//创建学生对象
student.doHomeWork();
}
}
②执行结果
(2)通过Constructor类的newInstance方法创建对象
可以传入参数,具体实现见三、操纵构造方法–创建对象(2)T newInstance(Object… initargs)
(3)通过Class类的newInstance方法创建对象
该方法不能传入参数,调用无参构造方法
①源代码
package test;
class Student{
private String name;
public Student() {
}
public Student(String name) {
this.name = name;//给全局变量赋值
}
public void doHomeWork() {
System.out.println(name+"正在做作业。。。。。");
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;//获取Class类实例化对象
Student student = clazz.newInstance();//相当于调用无参构造方法
student.doHomeWork();
}
}