在 Java 中是否可以使用自定义类从平台隐藏类?例如创建自定义 java.lang.String 或自定义 java.lang.StringBuffer?我之所以问,是因为我最近发现 C# /nostdlib 中有一个选项允许您重新定义整个 System 命名空间,我想知道 Java 是否有类似的东西。
请注意,C# 的 /nostdlib 是一个编译器选项,而不是在运行时考虑的东西。
在 Java 中是否可以使用自定义类从平台隐藏类?例如创建自定义 java.lang.String 或自定义 java.lang.StringBuffer?我之所以问,是因为我最近发现 C# /nostdlib 中有一个选项允许您重新定义整个 System 命名空间,我想知道 Java 是否有类似的东西。
请注意,C# 的 /nostdlib 是一个编译器选项,而不是在运行时考虑的东西。
您可以修改标准库或替换您自己的标准库以供个人使用,但 Oracle 不支持这一点,并且不允许您将修改后的版本分发给其他人。有各种命令行和配置选项可以告诉 JVM 在哪里寻找类。替换引导类更难,但它是可能的。
请注意,完全从头开始创建自己的版本会很困难,因为有几个类(至少)Object
与Class
JVM 实现紧密相关。为简单起见,您可能希望保持所有使用本机代码的类相同。
请注意,这与类 Shadowing 不同,后者是一个纯粹的编译时概念,发生在多个标识符冲突时,通常是由于导入(java.lang.*
隐式导入,您对此无能为力)。这些冲突通常通过静默使用其中一种可能性或根据情况引发编译错误来解决(有关详细信息,请参阅 JLS)。
为了替换 java.lang 类或其他一些“系统”类,您必须修改引导类路径。如果您从命令行运行 Java,这很容易完成,但如果您在某种“环境”中运行它,则可能不允许您进行更改。
此外,许多 java.lang 等类都有本地方法实现,您必须提供自己的替代方法或以某种方式安排重用现有实现。
您可以将自己的类用于库类。开始时你可以定义一个-bootclasspath
来定义你自己的类库。
这不是一件容易的事,因为某些类与正在运行的 VM 紧密绑定,例如 class String
。对于这种情况,您必须查看 JLS。
Sun/Oracle 不允许 JSE/JDK 的许可这样做。然而,我最近了解到,Groovy可以做一些令人惊奇的事情,比如添加方法或覆盖 java.lang.* 包的方法。
Groovy 基于 Java/JVM,因此您可以轻松地将它们组合到一个应用程序中。