Java反射 - Java反射对象创建
我们可以使用反射动态创建类的对象。通过调用其中一个构造函数。
然后我们可以访问对象的字段的值,设置它们的值,并调用它们的方法。
有两种方法来创建对象:
- 使用no-args构造函数
- 使用带参数的构造函数
无参数构造函数
如果你有一个 Class
对象的引用,你可以创建一个对象该类对Class类使用 newInstance()
方法。
此方法不使用参数,并且是等效的使用new运算符的类的no-args构造函数。
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()); } } }
上面的代码生成以下结果。
带参数的构造函数
您可以通过调用特定的构造函数使用反射创建对象。它涉及两个步骤。
- 获取构造函数的实例
- 调用newInstance来调用它
你可以得到这个构造函数的引用,如图所示:
Constructor<MyClass> cons = myClass.getConstructor(int.class, String.class);
然后调用带有参数的 newInstance()
方法来创建一个对象。
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()
方法。
它的第一个参数是它来自和的对象第二个参数是同一顺序中所有参数的varargs作为方法的声明。
在静态方法的情况下,我们只需要为第一个参数指定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()); } } }
上面的代码生成以下结果。