我开始知道,使用反射我们可以创建对象而不使用“新”关键字。所以我想知道他们是否有任何差异或使用Reflection的特定场景。因为直到现在我没有创建或看到任何代码创建与反射的对象。使用“新”关键字创建的对象并使用反射创建对象
为什么使用'新'变得如此使用和反思没有。
我开始知道,使用反射我们可以创建对象而不使用“新”关键字。所以我想知道他们是否有任何差异或使用Reflection的特定场景。因为直到现在我没有创建或看到任何代码创建与反射的对象。使用“新”关键字创建的对象并使用反射创建对象
为什么使用'新'变得如此使用和反思没有。
只有在想要基于名称(字符串)或在编译时无法访问的类型(例如插件)实例化类型时,才会使用反射。你不想用它来代替new
在正常情况下实例化类型。
反射通常比简单的代码慢得多,使用起来更繁琐。它不是普通代码的替代品(如新运算符),而是常规代码无法使用的情况的替代方法。
Mehrdad是正确的。在需要在运行时而不是编译时执行某些操作时使用反射。也许你需要执行的方法直到运行时才知道,或者对象类型不是。插件就是一个很好的例子。
反射会带来性能下降,这就是为什么您应该尝试将其限制为仅适用于不适合您的情况。
为什么使用'new'变得如此使用,并且反射不到。
与“新”关键字相比,使用反射是很多工作;它也导致较少可读的代码。
当出于某种原因,实例化对象的代码无法知道该对象的具体类型时,会使用反射。反射广泛用于creational design patterns。
对于一个更加真实世界的例子,在春季框架中这种用法很多。我们将在xml中定义对象及其协作类的依赖项,并且容器实际上将使用反射来创建它们的实例,甚至使用反射调用生命周期方法并移交创建的对象。这是您将使用的一种典型场景。此外,如果您查看大多数BRMS解决方案,它们会使用反射来在运行时使用反射来触发业务规则方法。尽管每天使用反射创建对象的真实世界都很少,但使用JDBC(Class.forName(“driver class”))时,使用某种反射的另一个地方是其他地方。
假设你想用一个构造函数,采用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被盗)
应当清楚比前者既更可读的和更快的键入。此外,反思往往痛苦缓慢。另一方面,反射允许在编译时不需要知道类就可以实例化对象。
总之,只有在没有其他选择时才使用反射...
赞成的new
:
赞成反思:
所以,你可以看到,new
是你想要在99%的情况下使用。反射在某些框架内部使用,如模拟对象框架,依赖注入框架或服务提供者接口(SPI)。在大多数情况下,你会成为这些东西的使用者,但不要自己写。
顺便说一句,如果你仍然想使用反射,那里有工具可以通过反射使实例化对象更简单:想起objenesis。
我甚至会说,避免在任何其他时间使用它。它会造成不必要的混淆和脆弱。 – 2010-01-20 20:21:45
@亚历克斯:确实。他们没有真正的可比性。意味着做不同的事情。 – 2010-01-20 20:24:43