学习任务:

视频学习

认识反射构造方法API

准备环境

测试获取构造方法

测试调用构造方法

通过Class对象的如下方法可获取一个对象的构造方法信息:

// 返回所有公共构造方法对象的数组(仅本类)
public Constructor<?>[] getConstructors()	
// 返回所有构造方法对象的数组(包含私有的)(仅本类)
public Constructor<?>[] getDeclaredConstructors()	
// 返回单个公共构造方法对象
public Constructor<T> getConstructor(Class<?>... parameterTypes)	
// 返回单个构造方法对象(可以使用私有的)
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

本节选用“多态案例”章节的类,包括:基础学生类、普通学生类、vip学生类、课程类等。

/**
 * 
 */
package com.pbteach.javase.oop.reflect4;

/**
 * 学生信息类(基础类)
 * 
 * @author 攀博课堂
 * @version v1.0
 */
public class PbStudent {

	// 学生编号
	public long id;

	// 学生昵称
	private String nickName;
	// 邮箱
	private String email;

	// 头像
	private String pic;
	// 密码
	private String password;
	// 选课列表
	private static PbCourse[] selections;
	

	//学生选课方法
	public void selectCourse(PbCourse course) {
		System.out.println("学生选课");
	}

	//父类的默认构造方法
	public PbStudent() {
		

	}
	
	//自定义的构造方法
	public PbStudent(long id, String nickName, String email) {
		this.id = id;
		this.nickName = nickName;
		this.email = email;
	}
	//获取学生在攀博课堂的服务权限内容
	public void getService() {
		
	}
	//获取折扣,多态调用时父类中此方法不会使用
	public float getDiscount() {
		
		return 1;
	}
	private int testPrivate() {
		return 0;
	}
	//getter/setter...
	
}

/**
 * 
 */
package com.pbteach.javase.oop.reflect4;

import java.time.LocalDate;

/**
 * vip学生类
 * 
 * @author 攀博课堂
 * @version v1.0
 */
public class PbStudentVip extends PbStudent {

	// vip服务截止时间
	private LocalDate vipDeadline;
	// vip服务的购买时间
	private LocalDate vipCreateTime;
	// vip专属指导老师
	public String pbteacher;
	// vip专属群
	public String pbgroup;
	public PbStudentVip() {
		super();
	}
	public PbStudentVip(long id, String nickName, String email) {
		super(id, nickName, email);
	}

	// 获取学生在攀博课堂的服务内容
	public void getService() {
		System.out.println("=======vip学生======");
		System.out.println("攀博课堂自学Java课程");
		System.out.println("资源下载");
		System.out.println("在线问答交流");
		System.out.println("攀博课堂Vip专属老师指导");
		System.out.println("攀博课堂Vip专属交流群");

	}
	
	//子类扩展了一个和父类完全不一样的方法
	//判断vip账户是否有效
	public boolean isValid() {
		//如果vipDeadline截止时间在当前时间之后则有效
		if(vipDeadline.isAfter(LocalDate.now())) {
			System.out.println("账户有效");
			//账户有效
			return true;
		}
		System.out.println("账户无效");
		//账户无效
		return false;
		
	}
	//获取折扣
	public float getDiscount() {
		//实际企业开发中这里可有会从数据库来获取配置的折扣信息...
		
		return 0.7f;
	}
	//getter/setter

}

获取构造方法与获取成员方法的区别在于仅可以获取本类的构造方法。

package com.pbteach.javase.oop.reflect4;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.time.LocalDate;



/**
 * 反射构造方法测试
 * @author 攀博课堂
 * @version v1.0
 */
public class ReflectTest {
	//获取构造方法
	public static void test1() throws Exception {
		//获取PbStudentVip类的Class对象
		Class class1 = PbStudentVip.class;
		//获取本类所有public构造方法
		Constructor[] constructors = class1.getConstructors();
		for (int i = 0; i < constructors.length; i++) {
			System.out.println(constructors[i]);
		}
		//获取PbStudentVip的有参构造方法
		Constructor declaredConstructor = class1.getDeclaredConstructor(long.class, String.class, String.class);
		System.out.println(declaredConstructor);
	}
	..

输出:

public com.pbteach.javase.oop.reflect4.PbStudentVip()
public com.pbteach.javase.oop.reflect4.PbStudentVip(long,java.lang.String,java.lang.String)
public com.pbteach.javase.oop.reflect4.PbStudentVip(long,java.lang.String,java.lang.String)

调用构造方法返回一个对象实例。

下边代码测试调用无参构造方法

//调用构造方法
	public static void test2() throws Exception {
		//获取PbStudentVip类的Class对象
		Class class1 = PbStudentVip.class;
		//调用无参构造方法
		PbStudentVip pbStudentVip = (PbStudentVip) class1.newInstance();
		pbStudentVip.setId(101L);
		System.out.println(pbStudentVip.getId());
		
		//获取无参数构造方法
		Constructor constructor = class1.getConstructor(null);
		PbStudentVip pbStudentVip2 = (PbStudentVip) constructor.newInstance(null);
		pbStudentVip2.setNickName("攀博");
		System.out.println(pbStudentVip2.getNickName());
		
		//获取PbStudentVip的有参构造方法
		Constructor declaredConstructor = class1.getDeclaredConstructor(long.class, String.class, String.class);
		PbStudentVip pbStudentVip3 = (PbStudentVip) declaredConstructor.newInstance(101L,"攀博","1759102882@qq.com");
		System.out.println(pbStudentVip3.getEmail());
		
	}

输出:

101
攀博
1759102882@qq.com
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题