反射機制--獲取例項化物件
阿新 • • 發佈:2018-12-26
在上一節中(點選開啟連結),獲取到了位元組碼檔案物件,那麼如何獲取該位元組碼檔案對應的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,"小明");
}
}
執行結果: