我們可以使用反射動(dòng)態(tài)創(chuàng)建類的對(duì)象。通過調(diào)用其中一個(gè)構(gòu)造函數(shù)。
然后我們可以訪問對(duì)象的字段的值,設(shè)置它們的值,并調(diào)用它們的方法。
有兩種方法來創(chuàng)建對(duì)象:
如果你有一個(gè) Class
對(duì)象的引用,你可以創(chuàng)建一個(gè)對(duì)象該類對(duì)Class類使用 newInstance()
方法。
此方法不使用參數(shù),并且是等效的使用new運(yùn)算符的類的no-args構(gòu)造函數(shù)。
MyClass m = myObject.newInstance();
class MyClass { public MyClass() { System.out.println("called"); } } public class Main { public static void main(String[] args) throws InstantiationException { Class<MyClass> personClass = MyClass.class; try { MyClass p = personClass.newInstance(); System.out.println(p); } catch (InstantiationException | IllegalAccessException e) { System.out.println(e.getMessage()); } } }
上面的代碼生成以下結(jié)果。
您可以通過調(diào)用特定的構(gòu)造函數(shù)使用反射創(chuàng)建對(duì)象。它涉及兩個(gè)步驟。
你可以得到這個(gè)構(gòu)造函數(shù)的引用,如圖所示:
Constructor<MyClass> cons = myClass.getConstructor(int.class, String.class);
然后調(diào)用帶有參數(shù)的 newInstance()
方法來創(chuàng)建一個(gè)對(duì)象。
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; class MyClass { public MyClass(int i, String s) { System.out.println("called"); System.out.println(i); System.out.println(s); } } public class Main { public static void main(String[] args) { Class<MyClass> myClass = MyClass.class; try { Constructor<MyClass> cons = myClass.getConstructor(int.class, String.class); MyClass chris = cons.newInstance(1, "abc"); System.out.println(chris); } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { System.out.println(e.getMessage()); } } }
上面的代碼生成以下結(jié)果。
我們可以通過方法引用使用反射調(diào)用方法。
要調(diào)用方法,請(qǐng)調(diào)用方法引用的 invoke()
方法。
它的第一個(gè)參數(shù)是它來自和的對(duì)象第二個(gè)參數(shù)是同一順序中所有參數(shù)的varargs作為方法的聲明。
在靜態(tài)方法的情況下,我們只需要為第一個(gè)參數(shù)指定null。
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; class MyClass { public MyClass() { } public void setName(String n) { System.out.println(n); } } public class Main { public static void main(String[] args) { Class<MyClass> myClass = MyClass.class; try { MyClass p = myClass.newInstance(); Method setName = myClass.getMethod("setName", String.class); setName.invoke(p, "abc"); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) { System.out.println(e.getMessage()); } } }
上面的代碼生成以下結(jié)果。
更多建議: