详述反射中构造方法

创建一个Student类

public class Student {
	 
	public String name;
	
	public Student() {
		
	}
	
    public Student(String name) {
		
    	this.name =name;
	}
	public void doHomework() {
		System.out.println(name+"正在写作业。。。");
	}
}

1.如何获取构造方法:

import java.lang.reflect.Constructor;

public class Test {
	
	public static void main(String[] args) {

		
		Class clazz =null;
		clazz = Student.class;   //获取Student类实例
		try {
			Constructor constructor = clazz.getConstructor();   //返回Student类的构造方法,存入constructor 中
			System.out.println(constructor.getName());
		} catch (Exception e1) {
			e1.printStackTrace();
		} 
	
		
		try {
			Constructor constructor1 = clazz.getConstructor(String.class);   //有参构造方法
			System.out.println(constructor1.getName());
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

但是.getConstructor();只适用于Student类中的public方法。如果构造方法是private,则用
.getDeclaredConstructor();

import java.lang.reflect.Constructor;

public class Test {
	
	public static void main(String[] args) {

		Class clazz =null;
		clazz = Student.class;   //获取Student类实例
        try {
			Constructor constructor1 = clazz.getDeclaredConstructor(String.class);
			System.out.println(constructor1.getName());
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

2.如何获取构造方法的信息
通过Constructor类某些方法可以获取某个构造方法的信息,这些方法如下:
①返回Class对象
getDeclaringClass():返回声明Constructor对象对应构造方法的类的Class对象。
②返回int类型
getModifiers():以整数形式返回Constructor对象表示的构造函数的修饰符。
③返回String类型 getName() :以字符串形式返回Constructor对象所表示得构造方法的名称。
④返回Class<?>[] 数组 getParameterTypes():返回由Constructor对象所表示的构造方法的形参类型 对应Class对象 组成的数组 如果构造方法没有参数,则数组长度为0。
只有Student类中都是public才可以用

import java.lang.reflect.Constructor;

public class Test {
	
	public static void main(String[] args) {

		Class clazz =null;
		clazz = Student.class;   //获取Student类实例
		try {
			Constructor constructor = clazz.getDeclaredConstructor(String.class);   //获取构造方法
			
			clazz = constructor.getDeclaringClass();
			System.out.println(clazz.getName());
			
			int mod = constructor.getModifiers();
			String str = Modifier.toString(mod);
			System.out.println(str);
			
			System.out.println(constructor.getName());
			
			Class<?>[] clazzs= constructor.getParameterTypes();
			
			for(Class zz : clazzs) {
			System.out.println(zz.getName());
			}
		}catch (Exception e1) {
			e1.printStackTrace();
		} 	
	}
}

运行结果
在这里插入图片描述

3.使用该构造方法
①通过Constructor类某些方法可以创建对象,这些方法如下:
void setAccessible(boolean flag):调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
②constructor.newInstance(Object… initargs):使用此Constructor对象表示的构造方法 来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。

import java.lang.reflect.Constructor;

public class Test {
	
	public static void main(String[] args) {

		Class clazz =null;
		clazz = Student.class;   //获取Student类实例
        try {
			Constructor constructor = clazz.getDeclaredConstructor(String.class);
			constructor.setAccessible(true);   //忽略访问权限
			Object object = constructor.newInstance("tom");   //创建新对象 ,返回一个Object类型的对象
			Student stu = (Student)object;   //创建了stu对象,可以调用方法
			stu.doHomework();
		  } catch (Exception e1) {
			e1.printStackTrace();
		} 
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值