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



