【问题标题】:Is using Java Reflection Bad Practice?使用 Java 反射是不好的做法吗?
【发布时间】:2016-04-15 10:14:29
【问题描述】:

我正在为客户构建一个应用程序,我需要能够通过字符串引用字段值,即用户使用字符串来定义他们想要更改哪个字段的值,这是抽象框架的一部分,所以从技术上讲,我不知道他们想要更改的字段的名称。当然,我可以使用哈希映射来做到这一点,但我正在考虑使用 java 反射,因为这允许字段保留为对象的字段,而不是将值编码到哈希映射中。我在自己的个人工作中使用过反射,但我想知道使用 Java 反射是否真的是不好的做法,我应该坚持使用 hashmap 方法。

(对于解决所描述的设计问题的任何其他建议也表示赞赏)

谢谢

【问题讨论】:

  • 我改写您的问题:“操纵对象是一种不好的做法,因此它们不会按预期工作吗?”我想你可以回答这个问题。
  • erm 不,它略有不同,因为应用程序实际上是基于设置要更改的对象的值。问题是它们需要通过它们的字符串名称来引用
  • 在 Android 中这是个坏主意,因为 proguard 不能解决这个问题。
  • 尽可能避免反射,除非它是你的最后选择。
  • 看来你已经收到了大部分警告,所以我只是补充一下,Sun 没有为 Java 语言添加反射,只是为了让我们能够大开眼界(或者也许是在脚下开枪)。有时它只是适合这项工作的工具。很难从这个问题中说出来,不管你的情况是否如此。

标签: java design-patterns reflection design-principles


【解决方案1】:

这个问题本身是基于意见的,尽管我相信大多数人都会同意你不能只说“反思是不好的”。有时这是唯一的方法,这就是很多库使用反射的原因。有时这不是唯一的方法,但解决方法会更糟。有时这不是唯一的方法,也不是最简单的方法,但开发人员对反射的力量感到惊讶,以至于无法直截了当地思考。

除了最后一个,还有很多正当理由可以考虑将反射作为一种解决方案。

【讨论】:

    【解决方案2】:

    个人反思让我感到难过,根据我的经验,几乎总是有更好的方法。在您描述的问题中,基于字符串设置变量我会考虑使用您的哈希图想法,该想法将通过字符串键引用变量,这看起来与您所描述的完全一样。如果您需要引用不存在的值的能力,您还可以包含工厂方法以在不存在键时创建变量然后添加到映射中,如果您要包装对象,那么它们将通过引用传递以避免您遇到的问题描述,但这取决于实现(例如,如果您引用原语,则使用整数类等进行自动装箱)这将允许更紧密和定义明确的实现,而不是在这里和到处反映值。为防反射偏差道歉!希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 2011-02-18
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      相关资源
      最近更新 更多