类上的指定包对编译是否重要?
是的,这很重要。调用的类pkg.pkg.Runtime()
不能像加载一样加载java.lang.Runtime
。
此外,如果我的记忆是正确的,JVM 中还有一些额外的安全措施来防止正常的应用程序将类注入到核心包中,例如java.lang
.
如果您需要更改java.lang.Runtime
类的行为(出于实验目的!),那么我认为您需要将修改后的版本放在引导类路径上,在“rt.jar”文件之前。
然而:
这种程度的修修补补很容易导致 JVM 不稳定;即难以诊断的硬JVM崩溃。
如果您的目标是生产“生产质量”工具,那么您会发现涉及修补 JVM 的事情被认为是不可接受的。人们会非常怀疑安装说明,如“将其添加到已安装的 JVM 的引导类路径”之类的内容。
分发“修补过的”JVM 可能会违反 Oracle 的 Java 许可协议。
我的建议是寻找一种不那么侵入性的方式来做你想做的事情。例如,如果您尝试进行病毒检查,请在 JVM 之外进行,或者在自定义应用程序类加载器中进行。
你评论说:
我有一个自定义类加载器,我的问题是:如果我编译一个标记为 pkg.pkg.Runtime 的类,我可以在我的类加载器中注册为 java.lang.Runtime 吗?
正如我上面所说,不,你不能。字节码文件中嵌入了类名。如果你试图通过加载一个不同名称的类来“拉一个 swifty”,JVM 将抛出一个Error
.
和:
如果没有,那么我该如何替换课程?如果编译的包名称必须等于请求引用的命名,那么我可以修改 .class 文件以匹配,或者可以像在 java.lang 包中一样编译它?
这就是你必须做的。您需要在源代码中命名该类java.lang.Runtime
并对其进行编译。
但是我上面的建议的 意思是你应该在类加载器中使用病毒检查。忘记尝试替换/修改Runtime
. 由于我上面列出的原因,这是一个坏主意。