使用“new”关键字创建的对象,并使用反射创建

时间:2010-01-20 18:00:56

标签: java reflection

我开始知道使用Reflection我们可以在不使用“new”关键字的情况下创建对象。所以我想知道它们或使用Reflection的任何特定场景是否存在任何差异。因为到目前为止我没有创建或看到任何用反射创建对象的代码。

为什么使用'new'变得如此习惯并且没有反思。

6 个答案:

答案 0 :(得分:9)

只有当您希望基于其名称(字符串)或您在编译时无法访问的类型(例如插件)实例化类型时,才使用反射。在正常情况下,您不希望使用它代替new来实例化类型。

答案 1 :(得分:3)

  

为什么使用'new'变得如此习惯   反思不是。

与'new'关键字相比,使用反射是很多工作;它也导致代码不太可读。

当出于某种原因,实例化对象的代码无法知道该对象的具体类型时,会使用反射。反射被广泛用于creational design patterns

答案 2 :(得分:2)

与简单代码相比,反射通常更慢,更乏味。它不是常规代码(如新运算符)的替代品,而是替代常规代码无法使用的情况。

答案 3 :(得分:1)

Mehrdad是对的。当您需要在运行时而不是编译时执行某些操作时,将使用反射。也许你需要执行的方法直到运行时才知道,或者对象类型不是。插件就是一个很好的例子。

反射确实会导致性能下降,这就是为什么你应该尝试将其限制在新的不适合你的情况下。

答案 4 :(得分:1)

赞成new

  1. 它比反射快得多。
  2. 它可以使代码更清晰,更易于维护。
  3. 反射不是类型安全的。
  4. 由于#3,具有重构支持的IDE(例如Eclipse)无法很好地处理反射。
  5. 支持反思:

    1. 当您不知道要在编译时实例化的类的类型时,它是唯一的选项。
    2. 正如您所看到的,new是您希望在99%的情况下使用的内容。反射在某些框架内使用,如模拟对象框架,依赖注入框架或服务提供者接口(SPI)。在大多数情况下,你会成为这些东西的用户,但不能自己写。

      顺便说一句,如果你仍然想要使用反射,那里有一些工具可以通过反射实例化对象减少痛苦:objenesis浮现在脑海中。

答案 5 :(得分:0)

对于一个更现实世界的例子来说,重度这样的用法是在spring框架中。我们将在其中定义对象的依赖项及其在xml中的协作类,容器实际上将使用反射创建它们的实例,甚至使用反射调用生命周期方法并切换创建的对象。这是您将使用的典型场景。此外,如果您查看大多数BRMS解决方案,他们会使用反射在运行时使用反射触发业务规则方法。虽然每天使用反射来创建对象的现实世界很少,但是在使用JDBC(Class.forName(“driver class”))时,另一个使用某种反射的地方。