有没有办法重写Java应用程序中的库类

有没有办法重写Java应用程序中的库类,java,class,rt.jar,Java,Class,Rt.jar,我正在使用Eclipse和Netbeans,现在更喜欢Netbeans。如果开发java库中的系统类(如FileReader),有没有办法将该类添加到应用程序中,并让本地类取代库副本 这样做的目的是在仍然使用普通jdk的情况下,能够一次扩展一个特定的类 具体来说,我正在使用java.lang.StringBuilder和java.io.FileWriter 我编写了一个修改过的StringBuilder类。如果我在我的目录中创建它: java/lang/FastStringBuilder jav

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

这样做的目的是在仍然使用普通jdk的情况下,能够一次扩展一个特定的类

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

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

javac抱怨我试图编译一个受限包java.lang

如果重命名包,则它无法从非公共的AbstractStringBuilder继承

他们正在使这条路变得更加困难。

而不是

import java.io.FileReader;
你只需要

import package.of.your.FileReader;

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

这在Java中真的是个坏主意

您需要自己的文件阅读器吗?-把它放在你的包里并使用它

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

但是永远不要试图替换任何库中的任何类,不管它们在哪里——在JDK或其他第三方框架中


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

只需在不同的包中使用相同的名称!但是您的意思是
使用具有相同名称的类
,还是希望提供自己的实现,例如
java.io.Filereader
?在第二种情况下是类路径工作。我能想到的更接近于
/lib/ext
()。但不确定它是否能工作。对于您自己的应用程序,这是可能的:将java.io.File类放在类路径的第一位。使用Java9会有问题,所以这可能不是一个好主意。当您谈论实现类时:一个新的FileReader只是一个可插入的阅读器,您自己的包并不是一个真正的问题。也许是AOP?不管你为什么要这样做,我保证有更好的方法来实现你的目标。如果我正在对库类进行更改以建议返回java,我宁愿不必用所有源代码构建一个项目,只需在项目中进行实验时编辑我想要的类。在我看来,应该有一些变通办法。我认为仅仅更改包名的建议可能是一个很好的解决方法,除非同一个包中存在使用默认访问权限共享数据的文件。当您使用另一个包名时,不能称之为“覆盖”。它只是另一个包中的另一个类,当然这是正确的Java方法。你创建了自己的类-你使用它。有标准实现,但您不使用它。好吧但是如果你想让你的类过载(比如说“替换标准的一个”)-永远不要这样做,不管有什么诀窍可以做到这一点…典型的无用堆栈溢出回答:“你实际上不想这样做”@mattswart但为什么这是无用的(或典型的)?基于这些答案,我不止一次地选择了更好的方法。好的,我正在使用StringBuilder。如果我在另一个包中创建了一个,它将不具有对非公共类AbstractStringBuilder的共享访问权。@Dov-是的,它不会。如果您创建
java.util.MyStringBuilder
,它将应用于
java.util
包中的所有非公共和非私有类及其属性/方法。但它仍然不会覆盖java.util.StringBuilder。只会有
StringBuilder
MyStringBuilder
类。