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