28-反射机制-04-反射机制(获取Class中的构造函数)

package bean;

public class Person {

	private int age;
	private String name;

	public Person() {
		super();
		System.out.println("...Person run...");

	}

	public Person(String name, int age) {
		super();
		this.age = age;
		this.name = name;
		System.out.println("...Person param run..." + this.name + ":"
				+ this.age);
	}

	public void show() {

		System.out.println(name + "...show run..." + age);

	}

	public void method() {

		System.out.println("...method run...");

	}

	public void paramMethod(String str, int num) {

		System.out.println("...paramMethod..." + str + ":" + num);

	}

	public static void staticMethod() {

		System.out.println("...staticMethod run...");

	}
}

======================分割线==============================

/*
 * 【获取Class中的构造函数】
 * 
 * 由于Class类内就newInstance()一个方法能获取实例对象,且该对象对应的构造函数必须是空参,所以一般被反射的类都具备
 * 空参构造函数,为了反射机制获取对象方便。
 */

package demo;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Demo {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {

		creatNewObject();
		creatNewObject_2();
		
	}
	
	public static void creatNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		
		//先前新建Person类对象的方法
/*
 * 早期new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存,
 * 并创建该字节码文件对象,接着创建该字节文件的对应的Person对象。
 */
		bean.Person p = new bean.Person();//这里Person类与前一视频一样,可不重复记录到本子上
		
		//如今新建Person类对象的方法步骤如下:
		
		//1.明确需要被new的类的名称
		String name = "bean.Person";
		
		//2.找寻该名称类文件,并加载进内存,并产生Class对象。
		Class clazz = Class.forName(name);
		
		/*
		 * 3.利用Class类的特有方法创建该类对象:
		 * 		public T newInstance() throws InstantiationException,IllegalAccessException
		 * 创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未
		 * 初始化,则初始化这个类。(就是相当于平时Person p = new Person的功能) 
		 */
		Object obj = clazz.newInstance();
//其实是用newInstance()方法去调用clazz内的空参构造函数Person()

/**
 * (1)如果Person类内没有空参构造函数,那么会抛出InstantiationException,即初始化失败,因为newInstance()方法去clazz内
 * 没找到空参构造函数;
 * 
 * (2)如果Person类内的空参构造函数被private,那么会抛出IllegalAccessException,即无效访问异常,因为待访问的构造函数
 * 被私有化,不能正常访问。
 */
		
	}
	
	public static void creatNewObject_2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		
		//先前新建Person类对象的方法
		bean.Person p = new bean.Person("小强",29);
		
		/*
		 * 现在需求是,用反射机制new一个实参对象
		 * 
		 * 【思路】如果指定参数29,表示要访问字节码文件中带有int参数的构造函数;如果指定参数“小强”和29,表示访问字节码
		 * 文件中同时带有String和int两个类型参数的构造函数。所以应该先获取对应的构造函数
		 * 
		 * 
		 */
		
/**
 * 打开API,点进java.lang,找到Class类,其内有特有方法:
 * 
 * (1)public Constructor<?>[] getConstructors() throws SecurityException:获取该字节码文件中所有公共构造函数
 * 
 * (2)public Constructor<?>[] getDeclaredConstructors() throws SecurityException
 * 获取该字节码文件中所有构造函数,哪怕私有的也能获取
 * 
 * (3)public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException,SecurityException
 * 获取带有指定参数的构造函数
 * 
 * 【注】java.lang.reflect包中具备了反射机制涉及到的所有对象,封装在AccessibleObject中,其子类为Constructor(构造器),
 *  Field(字段), Method(方法)。 
 */
		
		//如今新建Person类对象的方法如下:
		String name = "bean.Person";
		Class clazz = Class.forName(name);
		
		//获取到指定的构造函数对象
		Constructor constructor = clazz.getConstructor(String.class,int.class);
		
		//Constructor类中也有newInstance()方法,进行对象的初始化
		Object obj = constructor.newInstance("小强",29);
		
		
	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值