我有一个无法修改的 jar 文件,但我想使用不同的 .class 文件代替 jar 的一个成员。当 jar 中的代码尝试加载外部 .class 文件时,如何告诉 Java 使用它?
2 回答
您可以编译另一个具有完全相同名称的替换类的 jar 文件,并将其放在类路径中 jar 文件的前面。例如,这是各种slf4j
桥接 jar 所做的,用同源 slf4j 代码替换库代码中对 log4j 或 Jakarta Commons Logging 的调用;不需要以这种方式维护两套日志系统和配置。
如果要覆盖某个java...
类,可以使用一些命令行选项来更改引导类路径。查看http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html-Xbootclasspath
中的选项。注意警告。
lib/endorsed
如果您需要升级 Sun 使用的第三方 jar,也可以使用该目录。Oracle 使用其他组织的 XML 和 CORBA 库;如果他们发布了新版本并且您需要采用它,您可以。
您可以使用 AspectJ 来检测代码并可能替换它。如果around
需要,建议可以调用原始代码。
你可以看看你是否真的需要替换原始代码。一些系统提供定制挂钩。
您需要确保首先加载外部 .class 文件。如果类加载器已经加载了一个类,那么它将不会被重新加载。如果您使用的是应用程序服务器,那么有一些方法可以为类加载器配置加载类的首选项。但是,如果您使用的是独立应用程序,那么您可能需要扩展类加载器以按您想要的顺序加载文件。