1. 程式人生 > >反射機制--獲取例項化物件

反射機制--獲取例項化物件

在上一節中(點選開啟連結),獲取到了位元組碼檔案物件,那麼如何獲取該位元組碼檔案對應的Person物件呢?(仍然使用在text包下定義的Person類。)

執行早期的方法:

package text;

public class ReflectDemo2 {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		creatNewObject_1();
	}

	public static void creatNewObject_1() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		//早期:new的時候,先根據被new的類的名稱找尋該類的位元組碼檔案,並載入進記憶體,並建立該位元組碼檔案物件,並接著建立該位元組碼檔案對應的Person物件。
		text.Person p=new text.Person();
		
		//現在
//		String  name="text.Person";
//		Class clazz = Class.forName(name);  //找尋該名稱類檔案,並載入進記憶體,併產生Class物件
//		Object obj = clazz.newInstance(); //產生該類的物件,newInstance()建立此Class物件所表示的類的一個新例項
	}
}

執行結果:


執行現在的方法:

package text;

public class ReflectDemo2 {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		creatNewObject_1();
	}

	public static void creatNewObject_1() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		//早期:new的時候,先根據被new的類的名稱找尋該類的位元組碼檔案,並載入進記憶體,並建立該位元組碼檔案物件,並接著建立該位元組碼檔案對應的Person物件。
//		text.Person p=new text.Person();
		
		//現在
		String  name="text.Person";
		Class clazz = Class.forName(name);  //找尋該名稱類檔案,並載入進記憶體,併產生Class物件
		Object obj = clazz.newInstance(); //產生該類的物件,newInstance()建立此Class物件所表示的類的一個新例項
	}
}
執行結果:

在creatNewObject_1()方法中使用的建立物件都是無參的建構函式,我們通過creatNewObject_2()有參的建構函式來建立物件:

執行早期方法:

package text;

import java.lang.reflect.Constructor;

public class ReflectDemo2 {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		creatNewObject_2();
	}

	public static void 	creatNewObject_2(){
		//早期
		text.Person p=new text.Person(39,"小強");
		
		//現在
		/*
		 * 當要獲取指定名稱對應的類中所體現的物件時,而該物件初始化不使用空引數建構函式時:
		 * 既然是通過指定的建構函式進行物件的初始化,應該先獲取到該指定的建構函式。通過位元組碼檔案物件即可完成,
		 * 該方法是getConstructors(paramterTypes),返回一個Constructor物件,反映此Class物件表示的所有公共構造方法。
		 * */
//		String  name="text.Person";
//		Class clazz = Class.forName(name);
//		//獲取到了指定的建構函式物件
//		Constructor constructor=clazz.getConstructor(int.class,String.class);
//		
//		//通過該構造器物件的newInstance方法進行物件的初始化
//		Object obj=constructor.newInstance(38,"小明");
	}
	
}
執行結果:

執行現在方法:

package text;

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

public class ReflectDemo2 {

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

	public static void 	creatNewObject_2() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		//早期
//		text.Person p=new text.Person(39,"小強");
		
		//現在
		/*
		 * 當要獲取指定名稱對應的類中所體現的物件時,而該物件初始化不使用空引數建構函式時:
		 * 既然是通過指定的建構函式進行物件的初始化,應該先獲取到該指定的建構函式。通過位元組碼檔案物件即可完成,
		 * 該方法是getConstructors(paramterTypes),返回一個Constructor物件,反映此Class物件表示的所有公共構造方法。
		 * */
		String  name="text.Person";
		Class clazz = Class.forName(name);
		//獲取到了指定的建構函式物件
		Constructor constructor=clazz.getConstructor(int.class,String.class);
		
		//通過該構造器物件的newInstance方法進行物件的初始化
		Object obj=constructor.newInstance(38,"小明");
	}
	
}
執行結果: