我开始知道使用Reflection我们可以在不使用“new”关键字的情况下创建对象。所以我想知道它们或使用Reflection的任何特定场景是否存在任何差异。因为到目前为止我没有创建或看到任何用反射创建对象的代码。
为什么使用'new'变得如此习惯并且没有反思。
答案 0 :(得分:9)
只有当您希望基于其名称(字符串)或您在编译时无法访问的类型(例如插件)实例化类型时,才使用反射。在正常情况下,您不希望使用它代替new
来实例化类型。
答案 1 :(得分:3)
为什么使用'new'变得如此习惯 反思不是。
与'new'关键字相比,使用反射是很多工作;它也导致代码不太可读。
当出于某种原因,实例化对象的代码无法知道该对象的具体类型时,会使用反射。反射被广泛用于creational design patterns。
答案 2 :(得分:2)
与简单代码相比,反射通常更慢,更乏味。它不是常规代码(如新运算符)的替代品,而是替代常规代码无法使用的情况。
答案 3 :(得分:1)
Mehrdad是对的。当您需要在运行时而不是编译时执行某些操作时,将使用反射。也许你需要执行的方法直到运行时才知道,或者对象类型不是。插件就是一个很好的例子。
反射确实会导致性能下降,这就是为什么你应该尝试将其限制在新的不适合你的情况下。
答案 4 :(得分:1)
赞成new
:
支持反思:
正如您所看到的,new
是您希望在99%的情况下使用的内容。反射在某些框架内使用,如模拟对象框架,依赖注入框架或服务提供者接口(SPI)。在大多数情况下,你会成为这些东西的用户,但不能自己写。
答案 5 :(得分:0)
对于一个更现实世界的例子来说,重度这样的用法是在spring框架中。我们将在其中定义对象的依赖项及其在xml中的协作类,容器实际上将使用反射创建它们的实例,甚至使用反射调用生命周期方法并切换创建的对象。这是您将使用的典型场景。此外,如果您查看大多数BRMS解决方案,他们会使用反射在运行时使用反射触发业务规则方法。虽然每天使用反射来创建对象的现实世界很少,但是在使用JDBC(Class.forName(“driver class”))时,另一个使用某种反射的地方。