什么是反思,为什么它有用?
我对Java特别感兴趣,但我认为任何语言的原理都是一样的。
什么是反思,为什么它有用?
我对Java特别感兴趣,但我认为任何语言的原理都是一样的。
当前回答
我使用反射基于类名(String中的类名)创建一个对象,并调用该类的方法
Object obj = Class.forName(config.getClassPath())
.getDeclaredConstructor()
.newInstance();
Method method = obj.getClass().getMethod("getCustomer", SearchObject.class, ObjectConfig.class,
HttpServletRequest.class);
method.invoke(obj, searchObject, config, request);
但一个主要问题是,如果您在该类上自动连线了某个对象,则该对象将被重新初始化为null
其他回答
正如名称本身所暗示的,它除了提供在运行时动态调用创建实例的方法的功能之外,还反映了它所持有的例如类方法等。
许多框架和应用程序都使用它来调用服务,而实际上并不知道代码。
反射是一种API,用于在运行时检查或修改方法、类和接口的行为。
反射所需的类在java.lang.reflect包中提供。反射为我们提供了有关对象所属的类的信息,以及可以使用该对象执行的该类的方法。通过反射,我们可以在运行时调用方法,而不考虑与它们一起使用的访问说明符。
java.lang和java.lang.reflect包为java反射提供了类。
反射可用于获取以下信息:
类getClass()方法用于获取对象所属类的名称。构造函数getConstructors()方法用于获取对象所属类的公共构造函数。方法getMethods()方法用于获取对象所属类的公共方法。
反射API主要用于:
IDE(集成开发环境),例如Eclipse、MyEclipse、NetBeans等。调试器和测试工具等。
使用反射的优点:
可扩展性特性:应用程序可以通过使用扩展性对象的完全限定名称创建扩展性对象实例来使用外部用户定义的类。
调试和测试工具:调试器使用反射属性来检查类上的私有成员。
缺点:
性能开销:反射操作的性能低于非反射操作,应避免在性能敏感应用程序中频繁调用的代码段中使用。
内部暴露:反射代码打破了抽象,因此可能会随着平台的升级而改变行为。
参考:Java Reflection javareviewed.blogspot.in
例子:
以一个远程应用程序为例,它为您的应用程序提供了一个对象,您可以使用其API方法获取该对象。现在,基于对象,您可能需要执行某种计算。
提供者保证对象可以是3种类型,我们需要根据对象的类型进行计算。
因此,我们可以在3个类中实现,每个类包含不同的逻辑。显然,对象信息在运行时可用,因此您无法静态编码以执行计算,因此反射用于实例化类的对象,您需要根据从提供程序接收的对象执行计算。
我想举个例子来回答这个问题。首先,Hibernate项目使用反射API生成CRUD语句,以弥合运行应用程序和持久性存储之间的鸿沟。当域中的情况发生变化时,Hibernate必须了解这些情况,才能将其持久化到数据存储中,反之亦然。
另外,Lombok项目也可以。它只是在编译时注入代码,导致代码被插入到域类中。(我认为这对getter和setter来说是可以的)
Hibernate选择反射是因为它对应用程序的构建过程影响最小。
在Java7中,我们有MethodHandles,它用作反射API。在项目中,要使用记录器,我们只需复制粘贴下一个代码:
Logger LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass().getName());
因为在这种情况下很难出错。
重要的
从Java9开始,您不能再使用反射,除非package-info.Java打开模块以进行反射访问。
默认情况下,拒绝对模块中的所有包进行“反射”访问。
请参阅了解Java 9模块