如何通过反射获取并操纵构造方法?

一、获取构造方法

借助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();
	}
}

②执行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值