如何在jar中monkeypatch .class文件

时间:2013-09-20 00:40:58

标签: java jar monkeypatching

我有一个无法修改的jar文件,但我想使用另一个.class文件代替jar的其中一个成员。当jar中的代码尝试加载它时,如何告诉Java使用外部.class文件?

2 个答案:

答案 0 :(得分:2)

您可以使用具有完全相同名称的替换类编译另一个jar文件,并将其放在类路径中的jar文件之前。例如,这是各种slf4j桥接器用于替换对log4j或Jakarta Commons的调用,用同源slf4j代码在库代码中进行日志记录;一个人不需要维护两套日志系统和配置。

如果要覆盖java...类,可以使用某些命令行选项来更改引导类路径。查看http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html中的-Xbootclasspath选项。注意警告。

如果您需要升级Sun使用的第三方jar,还有lib/endorsed目录。 Oracle使用其他组织的XML和CORBA库;如果他们发布了新版本而你需要采用它,你可以。

您可以使用AspectJ来检测代码并可能替换它。 around建议可以根据需要调用原始代码。

您可以看到是否确实需要替换原始代码。有些系统提供定制钩子。

答案 1 :(得分:0)

您需要确保首先加载外部.class文件。如果类已经由类加载器加载,则不会重新加载它。如果您使用的是应用程序服务器,则可以通过多种方法配置加载类加载器类的首选项。但是,如果您使用的是独立应用程序,那么您可能需要扩展类加载器以按照您想要的顺序加载文件。