2010-01-20 174 views
3

我开始知道,使用反射我们可以创建对象而不使用“新”关键字。所以我想知道他们是否有任何差异或使用Reflection的特定场景。因为直到现在我没有创建或看到任何代码创建与反射的对象。使用“新”关键字创建的对象并使用反射创建对象

为什么使用'新'变得如此使用和反思没有。

回答

9

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

+1

我甚至会说,避免在任何其他时间使用它。它会造成不必要的混淆和脆弱。 – 2010-01-20 20:21:45

+0

@亚历克斯:确实。他们没有真正的可比性。意味着做不同的事情。 – 2010-01-20 20:24:43

2

反射通常比简单的代码慢得多,使用起来更繁琐。它不是普通代码的替代品(如新运算符),而是常规代码无法使用的情况的替代方法。

1

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

反射会带来性能下降,这就是为什么您应该尝试将其限制为仅适用于不适合您的情况。

3

为什么使用'new'变得如此使用,并且反射不到。

与“新”关键字相比,使用反射是很多工作;它也导致较少可读的代码。

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

0

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

1

假设你想用一个构造函数,采用String类型的单个参数来实例化类MyObject。与new

MyObject myObject = new MyObject("constructor-arg1"); 

与反射:

Constructor constructor = MyObject.class.getConstructor(String.class); 

MyObject myObject = (MyObject) constructor.newInstance("constructor-arg1"); 

(例如,从http://tutorials.jenkov.com/java-reflection/constructors.html被盗)

应当清楚比前者既更可读的和更快的键入。此外,反思往往痛苦缓慢。另一方面,反射允许在编译时不需要知道类就可以实例化对象。

总之,只有在没有其他选择时才使用反射...

1

赞成的new

  1. 它比反射快得多。
  2. 它导致更简洁的代码,这更容易维护。
  3. 反射不是类型安全的。
  4. 由于#3,具有重构支持的IDE(如Eclipse)无法很好地处理反射。

赞成反思:

  1. 这是当你不知道你想在编译时将类实例的类型的唯一选择。

所以,你可以看到,new是你想要在99%的情况下使用。反射在某些框架内部使用,如模拟对象框架,依赖注入框架或服务提供者接口(SPI)。在大多数情况下,你会成为这些东西的使用者,但不要自己写。

顺便说一句,如果你仍然想使用反射,那里有工具可以通过反射使实例化对象更简单:想起objenesis

相关问题