谢邀。在Java中,反射是一种API,用于在运行时检查或修改方法、类、接口的行为。
反射所需的类在java.lang.reflect包下提供。反射为我们提供了有关对象所属类的信息,以及可以使用该对象执行的该类的方法。通过反射,我们可以在运行时调用方法,而与它们所使用的访问说明符无关。反射可用于获取有关一些的有用信息类 getClass()方法用于获取对象所属的类的名称。构造函数 getConstructors()方法用于获取对象所属类的公共构造函数。方法 getMethods()方法用于获取对象所属类的公共方法。简单的例子为了先清楚下反射的用处,我们将看一个非常基本的示例,该示例在运行时检查简单Java对象的字段。
让我们创建一个简单的Person类,其中仅包含name和age字段,而根本不包含任何方法。这是Person类:
现在,我们将使用Java反射来发现此类所有字段的名称。为了欣赏反射的力量,我们将构造一个Person对象并将Object作为引用类型:
这个测试告诉我们,我们能够得到的数组Field对象从我们人的对象,即使参考对象是对象的父类。
在上面的示例中,我们仅对这些字段的名称感兴趣,但是还有很多事情可以做,我们将在后续部分中看到更多示例。
注意我们如何使用一个辅助方法来提取实际的字段名,这是一个非常基本的代码:
重点观察如果知道方法的名称和参数类型,则可以通过反射调用该方法。为此,我们使用以下两种方法getDeclaredMethod():创建要调用的方法的对象。该方法的语法是Class.getDeclaredMethod(名称,参数类型)name-要创建其对象的方法的名称parametertype-参数是Class对象的数组invoke():要在运行时调用类的方法,我们使用以下方法——
Method.invoke(对象,参数)如果类的方法不接受任何方法 参数,然后将null用作参数。通过反射,我们可以在类的类对象的帮助下访问类的私有变量和方法,并通过使用对象来调用方法,如上所述。为此,我们使用以下两种方法。Class.getDeclaredField(FieldName):用于获取私有字段。返回指定类型字段名称的字段类型的对象。Field.setAccessible(true): 允许访问该字段,而与该字段使用的访问修饰符无关。
使用发射的优势可扩展性功能:应用程序可以通过使用其完全限定的名称创建可扩展性对象的实例来使用外部的用户定义类。调试和测试工具:调试器使用反射的属性检查类的私有成员。缺点性能开销:反射操作比非反射操作的性能要慢,因此应避免在对性能敏感的应用程序中经常调用的代码段中避免这样做。内部曝光:反射代码破坏了抽象,因此可能会随着平台升级而改变行为。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有