【问题标题】:Is there any way to override library classes in a Java application [duplicate]有什么方法可以覆盖 Java 应用程序中的库类 [重复]
【发布时间】:2018-04-10 21:26:50
【问题描述】:

我正在使用 Eclipse 和 Netbeans,现在更喜欢 Netbeans。如果开发 Java 库中的系统类(例如 FileReader),有没有办法将该类添加到应用程序中并让本地类取代库副本?

我们的想法是能够在仍然使用普通 jdk 的同时一次扩充特定的类。

具体来说,我正在使用 java.lang.StringBuilder 和 java.io.FileWriter。

我写了一个修改过的 StringBuilder 类。如果我在我的目录中创建它: java/lang/FastStringBuilder

javac 抱怨我正在尝试编译受限包 java.lang。

如果我重命名包,那么它不能从非公开的 AbstractStringBuilder 继承。

他们让这种方式变得比需要的更难。

【问题讨论】:

  • 在不同的包中使用相同的名称!
  • 但是你的意思是use your class that has the same name 还是你想提供你自己的实现例如java.io.Filereader?在第二种情况下,它是类路径工作。
  • 我能想到的更接近的是/lib/extdocs.oracle.com/javase/tutorial/ext/basics/install.html)。不过不确定它会起作用。
  • 对于您自己可能的应用程序:将您的 java.io.File 类首先放在类路径上。使用 java 9 会有问题,所以这可能不是一个好主意。正如您所说的实现类:一个新的 FileReader 只是一个可插入的 Reader,您自己的包并不是真正的问题。也许是 AOP?
  • 无论您出于何种原因想要这个,我保证有更好的方法来实现您的目标。

标签: java class rt.jar


【解决方案1】:

在 Java 中这是非常非常糟糕的主意。

您需要自己的 FileReader 吗? - 在你的包中制作并使用它。

您需要使用标准 FileReader 中的方法吗? - 在您自己的 FileReader 中扩展或包装它并使用它。

但永远不要尝试替换任何库中的任何类,无论它们在 JDK 或其他第三方框架中的位置。

对于非常罕见和更糟糕的情况,您可以使用 AOP,但这确实很痛苦,也是另一个“更好的坏主意”。

【讨论】:

  • 如果我正在对库类进行更改以建议返回给 java,我宁愿不必使用所有源代码构建项目,只需在项目中进行试验时编辑我想要的类。在我看来,应该有一些解决方法。我认为仅更改包名称的建议可能是一个很好的解决方法,除非同一包中的文件将使用默认访问权限来共享数据。
  • 当你使用另一个包名时,它不能被称为“覆盖”。它只是另一个包中的另一个类,当然它是正确的 Java 方法。您创建了自己的课程 - 您使用它。标准实现在那里,但你不使用它。好的。但是......如果你想让你的班级超载(比如说“替换标准班级”) - 永远不要这样做,无论有什么技巧可以做到这一点......
  • 典型的无用堆栈溢出答案:“你实际上并不想这样做”
  • @MattSwarthout 为什么这没用(或典型)?我不止一次根据此类答案选择了更好的方法。
【解决方案2】:

代替

import java.io.FileReader;

你只需要

import package.of.your.FileReader;

使用您的实现而不是标准实现。

【讨论】:

  • 好的,我正在使用 StringBuilder。如果我在不同的包中创建一个,它将无法共享访问非公共类 AbstractStringBuilder。
  • @Dov - 是的,它不会。如果您创建java.util.MyStringBuilder,它将适用于java.util 包中的所有非公共和非私有类及其属性/方法。但是,它仍然不会覆盖 java.util.StringBuilder。只是会有StringBuilderMyStringBuilder 类。
猜你喜欢
  • 2016-12-23
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多