【问题标题】:Replacing java class?替换java类?
【发布时间】:2025-12-20 23:40:16
【问题描述】:

我正在为我的 java 防病毒软件开发沙盒功能,但我遇到了一个问题:类中的指定包对编译是否重要?

示例: 我正在运行一个想要使用Runtime.getRuntime().exec() 的程序,当类加载器尝试加载它以运行一个方法时,它是否检查文件中限定的包(如果它们存在)?我不希望尝试更改 JVM 中的文件,而只是从不同的包中加载文件。我可以完成加载等,但我唯一的困境是,它会崩溃和燃烧吗?在 java 中,它会被注册为java.lang.Runtime,但编译后的代码会说例如pkg.pkg.Runtime,它是否需要扩展旧的运行时?我的猜测是扩展旧的运行时只会破坏它。有人对这个有了解吗?我正在制作一个可测试的示例,但我还有一段距离,想得到一些答案,这可能会使某些人受益。

【问题讨论】:

  • 一个类以其完整的包名引用。 java.lang.Runtime,砰,就是这样。
  • 一些代码 sn-ps 将有助于理解您要完成的工作。

标签: java class classloader antivirus


【解决方案1】:

一个类中指定的包对编译有影响吗?

是的,这很重要。无法加载名为 pkg.pkg.Runtime() 的类就好像它是 java.lang.Runtime

另外,如果我没记错的话,JVM里面还有一些额外的安全措施可以防止正常的应用程序将类注入到java.lang这样的核心包中。

如果您需要更改 java.lang.Runtime 类的行为(出于实验目的!),那么我认为您需要将修改后的版本放在 boot 类路径上,在 "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 的行为。由于我上面列出的原因,这是一个坏主意。

【讨论】:

  • 我有一个自定义类加载器,我的问题是:如果我编译一个标记为 pkg.pkg.Runtime 的类,我可以在我的类加载器中注册为 java.lang.Runtime 吗?如果没有,那么我该如何替换课程?如果编译后的包名必须与请求引用的命名相同,那么我可以修改 .class 文件以匹配,或者像在 java.lang 包中一样编译它吗?