【问题标题】:How Can I Override Library Methods in Java?如何在 Java 中覆盖库方法?
【发布时间】:2015-08-18 10:00:35
【问题描述】:

我正在开发一个使用 Gson 的大型 Android 项目。方法fromJson() 在很多文件中被调用了几十次。每次调用此方法时,我都需要提供一些特殊情况测试。

我不想在每次使用此方法时都重复测试,而是遵循DRY 原则,并以某种方式简单地覆盖fromJson() 方法。

我的第一个想法是创建一个 Gson 的子类并覆盖该方法,但我仍然需要进行数十次(也许数百次)更改才能使其正常工作。但即使我愿意做这项工作,Gson 是final,因此无法扩展。

第二个想法:有可能改变 Gson 库代码。但我不想走这条路,因为我担心我可能会破坏原本可以完美运行的东西。

这是我以前从未涉足过的 Java 领域。有人有什么建议吗?

【问题讨论】:

  • 你能用Aspectj吗?
  • 从 Mockito 尝试 Spy:docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Spy.html - 您可以只重写一个方法,在其中添加一些逻辑,然后调用真正的方法。
  • 我既没有使用过 Aspectj 也没有使用过 Mockito。我不愿意在这个项目中添加另一个库,但我会花一个小时研究这些可能性。
  • @ScottBiggs 不确定 java 的反射是否与使用 android SDK 编译时的反射工作方式相同。但这里有一个很好的答案,它展示了你实际上如何“破解”这个库的最后一个字段:stackoverflow.com/a/3301720
  • @CausingUnderflowsEverywhere:很有希望。不幸的是,我的反思知识非常有限。

标签: java android methods overriding


【解决方案1】:

由于没有回复,我将继续并给出我自己的答案。

如果一个库类/方法被声明为final,那么重点就是永远不要继承或覆盖该类。而且由于它是一个库(而且我无权访问源代码),因此无法更改它。

  • 解决方案 #1:编写我自己的库。这当然打败了 使用库的全部目的(避免重新发明 轮子)。

  • 解决方案 #2:找到解决方法。听起来很hack-y,这是 可能是最合理的选择。

  • 解决方案 #3:忍受错误/错误/缺少功能。不是全部 问题是阻碍因素。你可能有一个很棒的程序 仍然没有达到每个期望的细节。

  • 解决方案 #4:放弃项目。有时这可能是可行的 选项。但目前不适合我。

【讨论】:

  • 如果您不喜欢该解决方案,请随意编写自己的解决方案。如果它甚至半途而废,我会给它一个检查。至少写一条评论来解释否决票!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多