Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,是否可以使用自定义类从Java.lang隐藏类?_Java - Fatal编程技术网

在Java中,是否可以使用自定义类从Java.lang隐藏类?

在Java中,是否可以使用自定义类从Java.lang隐藏类?,java,Java,在Java中,是否可以使用自定义类对平台隐藏类?例如,创建自定义java.lang.String或自定义java.lang.StringBuffer?我这样问是因为我最近发现C#/nostlib中有一个选项,允许您重新定义整个系统名称空间,我想知道Java是否有类似的功能 请注意,C#s/nostlib是一个编译器选项,在运行时不需要考虑。您可以修改标准库或将自己的库替换为个人使用,但Oracle不支持这一点,也不允许您将修改后的版本分发给其他人。有各种命令行和配置选项告诉JVM在哪里查找类。替

在Java中,是否可以使用自定义类对平台隐藏类?例如,创建自定义java.lang.String或自定义java.lang.StringBuffer?我这样问是因为我最近发现C#/nostlib中有一个选项,允许您重新定义整个系统名称空间,我想知道Java是否有类似的功能


请注意,C#s/nostlib是一个编译器选项,在运行时不需要考虑。

您可以修改标准库或将自己的库替换为个人使用,但Oracle不支持这一点,也不允许您将修改后的版本分发给其他人。有各种命令行和配置选项告诉JVM在哪里查找类。替换引导类比较困难,但这是可能的

请注意,完全从头开始创建自己的版本将很困难,因为几个类(至少是
Object
Class
)必然与JVM实现紧密相关。为了简单起见,您可能希望所有使用本机代码的类保持相同


请注意,这与类隐藏不同,类隐藏是一个纯粹的编译时概念,当多个标识符发生冲突时,通常由于导入(
java.lang.*
是隐式导入的,对此您无能为力)。这些冲突通常通过静默地使用其中一种可能性或根据情况引发编译错误来解决(有关详细信息,请参阅JLS)。

为了替换java.lang类或其他一些“系统”类,必须修改引导类路径。如果您从命令行运行Java,这很容易实现,但如果您在某种“环境”中运行Java,则可能不允许您进行更改


此外,许多java.lang等类都有本机方法实现,您必须提供自己的替代方法,或者以某种方式安排重用现有的实现。

Sun/Oracle不允许JSE/JDK的许可。 然而,我最近了解到,这可以做一些令人惊奇的事情,比如添加方法或覆盖java.lang.*包的方法


Groovy基于Java/JVM,因此您可以轻松地将它们组合到一个应用程序中。

您可以将自己的类用于库类。启动时,可以定义
-bootclasspath
来定义自己的类库


这不是一项容易的任务,因为有些类是临时绑定到运行的VM的,例如class
String
。在这种情况下,您必须查看JLS。

始终可以隐藏类。只需在代码中定义类。那么,对此类的任何引用实际上都引用了定义的代码,前提是您编写的类从当前的scope@Algorithms如果你想按照OP的要求对标准库的某些部分进行红精处理,那就要复杂得多。@Algorithms,我不认为它是这样工作的,引导类加载器已经从平台加载了这些类。即使使用自定义类加载器,建议的约定是委托给父类加载器,并且始终可以找到这些类加载器。我认为要做到这一点,你必须修改引导加载程序的功能。你不必修改引导加载程序,你只需要告诉它在启动时在不同的地方看。或者在它通常看起来的位置更改文件,但这更危险。@sbb是的,呃,我说的是“修改引导加载程序的功能”下一行是“功能”。从您的回复中,我了解到这是可能的,但这是一个运行时问题,而不是您可以向编译器指出的问题?作为一名开发人员,你不能强制执行这些东西吗?好吧,答案似乎是否定的,Java中确实没有与C#的/nostlib编译器标志等价的东西。@Mish不幸的是,我不熟悉C,所以我无法告诉你Java等价物是什么。看起来最接近的等价物是
-bootclasspath
。如果你说你为什么要这么做,也许会有帮助。