Java 反射是 Java 语言的一种功能,它允许程序在运行时动态地获取、操作任何类的信息,包括类的名字、属性、方法和构造函数。反射机制可以使我们在不了解类的情况下,创建对象并调用其方法。
Java 反射机制提供了一种通过字符串来操作对象的方式,它可以帮助我们在运行时动态地创建对象。使用反射机制,我们可以根据字符串来实例化一个对象,而不需要显式地使用 new 关键字。
Class clazz = Class.forName("com.example.MyClass"); // 获得Class对象 Object obj = clazz.newInstance(); // 通过Class对象实例化一个新的对象
上面代码中,我们使用 Class 的 forName() 方法来根据字符串“com.example.MyClass”来加载 MyClass 的 Class 对象;然后使用 newInstance() 方法来实例化一个新的 MyClass 对象。
此外,Java 还提供了 Constructor 的 newInstance() 方法来创建带有参数的对象。Constructor 的 newInstance() 方法会根据传入的参数去找到合适的构造函数并实例化一个新的对象。
Constructor constructor = clazz.getConstructor(String.class, int.class); // 获得带有特定参数签名的Constructor对象 Object obj = constructor.newInstance("Hello", 123); // 通过Constructor实例化一个新的MyClass对象
我们可以使用反射动态创建类的对象。通过调用其中一个构造函数。
然后我们可以访问对象的字段的值,设置它们的值,并调用它们的方法。
有两种方法来创建对象:
如果你有一个 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()); } } }
上面的代码生成以下结果。
您可以通过调用特定的构造函数使用反射创建对象。它涉及两个步骤。
你可以得到这个构造函数的引用,如图所示:
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()); } } }
上面的代码生成以下结果。
Java JSON教程 -JSON模式像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用...
Java网络教程 -Java异步套接字通道使用以下两个套接字通道类来执行异步套接字操作:java.nio.channels.AsynchronousServerSocket...
JavaFX教程 -JavaFX集合JavaFX中的集合由javafx.collections包定义,javafx.collections包由以下接口和类组成:接口接口描述Obse...
Java日期时间 -Java实例/持续时间实例和持续时间允许我们记录时间戳和已用时间。我们可以从瞬间添加和减去持续时间,以获得另一...
Java流连接Collectors类的joining()方法返回一个收集器,它连接CharSequence流,并将结果作为String返回。joining()方法是重载的...