我們可以使用反射動態(tài)創(chuàng)建類的對象。通過調用其中一個構造函數(shù)。
然后我們可以訪問對象的字段的值,設置它們的值,并調用它們的方法。
有兩種方法來創(chuàng)建對象:
如果你有一個 Class
對象的引用,你可以創(chuàng)建一個對象該類對Class類使用 newInstance()
方法。
此方法不使用參數(shù),并且是等效的使用new運算符的類的no-args構造函數(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()); } } }
上面的代碼生成以下結果。
您可以通過調用特定的構造函數(shù)使用反射創(chuàng)建對象。它涉及兩個步驟。
你可以得到這個構造函數(shù)的引用,如圖所示:
Constructor<MyClass> cons = myClass.getConstructor(int.class, String.class);
然后調用帶有參數(shù)的 newInstance()
方法來創(chuàng)建一個對象。
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()); } } }
上面的代碼生成以下結果。
我們可以通過方法引用使用反射調用方法。
要調用方法,請調用方法引用的 invoke()
方法。
它的第一個參數(shù)是它來自和的對象第二個參數(shù)是同一順序中所有參數(shù)的varargs作為方法的聲明。
在靜態(tài)方法的情況下,我們只需要為第一個參數(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()); } } }
上面的代碼生成以下結果。
更多建議: