替换java类?

替换java类?,java,class,classloader,antivirus,Java,Class,Classloader,Antivirus,我正在为我的java antivirus开发一个沙盒功能,我遇到了一个问题:类上指定的包对编译有影响吗 例如: 我正在运行一个想要使用Runtime.getRuntime().exec()的程序,当类加载器尝试加载该程序以运行一个方法时,它是否检查文件中限定的包(如果存在)?我不希望尝试在JVM中更改文件,而只是从不同的包中加载文件。我可以完成加载等,但我唯一的困境是,它会崩溃和燃烧吗?在java内部,它将注册为,java.lang.Runtime,但编译后的代码将显示例如pkg.pkg.Run

我正在为我的java antivirus开发一个沙盒功能,我遇到了一个问题:类上指定的包对编译有影响吗

例如: 我正在运行一个想要使用
Runtime.getRuntime().exec()
的程序,当类加载器尝试加载该程序以运行一个方法时,它是否检查文件中限定的包(如果存在)?我不希望尝试在JVM中更改文件,而只是从不同的包中加载文件。我可以完成加载等,但我唯一的困境是,它会崩溃和燃烧吗?在java内部,它将注册为,
java.lang.Runtime
,但编译后的代码将显示例如
pkg.pkg.Runtime
,并且它是否需要扩展旧的运行时?我的猜测是,扩展旧的运行时只会破坏它。有人知道这件事吗?我正在做一个可测试的例子,但我仍然有点远,我想得到一些答案,以及这可能有利于一些人

类上指定的包对编译是否重要

是的,这很重要。名为
pkg.pkg.Runtime()
的类不能像加载
java.lang.Runtime
那样加载

此外,如果我的内存是正确的,JVM中有一些额外的安全措施,以防止普通应用程序将类注入核心包,如
java.lang

如果您需要更改
java.lang.Runtime
类的行为(出于实验目的!),那么我认为您需要将修改后的版本放在引导类路径上,放在“rt.jar”文件之前

然而:

  • 这种级别的修补很容易导致JVM不稳定;i、 e.难以诊断的硬JVM崩溃

  • 如果您的目标是生成一个“生产质量”工具,那么您会发现涉及修补JVM的事情被认为是不可接受的。人们会非常怀疑那些说“将其添加到已安装JVM的bootclasspath”之类的安装说明

  • 分发“修补过的”JVM可能会违反Oracle的Java许可协议


我的建议是寻找一种不太打扰你的方式来做你想做的事情。例如,如果您试图执行病毒检查,可以在JVM外部执行,也可以在自定义应用程序类加载器中执行


你评论道:


我有一个自定义类加载器,我的问题是:如果我编译了一个标记为pkg.pkg.Runtime的类,我可以在我的类加载器中注册为java.lang.Runtime吗

正如我上面所说的,不,你不能。字节码文件中嵌入了类名。如果您试图通过加载具有不同名称的类来“拉一个快速”,JVM将抛出一个
错误

以及:

如果没有,那么如何替换该类?如果编译后的包名必须等于请求引用的命名,那么我可以修改.class文件以匹配它,或者像在java.lang包中一样编译它吗

这就是你必须要做的。您需要在源代码中命名类
java.lang.Runtime
,并将其编译为类

但是我上面的建议的意思是你应该在类加载器中使用病毒检查。忘记尝试替换/修改运行时的行为。出于我上面列出的原因,这是一个坏主意

类上指定的包对编译是否重要

是的,这很重要。名为
pkg.pkg.Runtime()
的类不能像加载
java.lang.Runtime
那样加载

此外,如果我的内存是正确的,JVM中有一些额外的安全措施,以防止普通应用程序将类注入核心包,如
java.lang

如果您需要更改
java.lang.Runtime
类的行为(出于实验目的!),那么我认为您需要将修改后的版本放在引导类路径上,放在“rt.jar”文件之前

然而:

  • 这种级别的修补很容易导致JVM不稳定;i、 e.难以诊断的硬JVM崩溃

  • 如果您的目标是生成一个“生产质量”工具,那么您会发现涉及修补JVM的事情被认为是不可接受的。人们会非常怀疑那些说“将其添加到已安装JVM的bootclasspath”之类的安装说明

  • 分发“修补过的”JVM可能会违反Oracle的Java许可协议


我的建议是寻找一种不太打扰你的方式来做你想做的事情。例如,如果您试图执行病毒检查,可以在JVM外部执行,也可以在自定义应用程序类加载器中执行


你评论道:


我有一个自定义类加载器,我的问题是:如果我编译了一个标记为pkg.pkg.Runtime的类,我可以在我的类加载器中注册为java.lang.Runtime吗

正如我上面所说的,不,你不能。字节码文件中嵌入了类名。如果您试图通过加载具有不同名称的类来“拉一个快速”,JVM将抛出一个
错误

以及:

如果没有,那么如何替换该类?如果编译后的包名必须等于请求引用的命名,那么我可以修改.class文件以匹配它,或者像在java.lang包中一样编译它吗

这就是你必须要做的。您需要在源代码中命名类
java.lang.Runtime
,并将其编译为类


但是我上面的建议的意思是你应该在类加载器中使用病毒检查。忘记尝试替换/修改运行时的行为。由于我上面列出的原因,这是一个坏主意。

一个类引用了它的完整属性