Java 动态加载扩展另一个类的类(从jar)

Java 动态加载扩展另一个类的类(从jar),java,classloader,abstract,urlclassloader,Java,Classloader,Abstract,Urlclassloader,我正在尝试创建一个能够从外部.jar文件加载类的应用程序。但是,我需要引用我将按其类型加载的类(它是Sax解析器的DefaultHandler的孙子类) 我想我应该这样做: 我将定义一个抽象类DefaultHandler 外部文件中的类将扩展Hammer(让我们调用外部类SpecialHammer) 我将使用URLLoader加载SpecialHammer 问题是,我不知道如何(以及在哪里)定义Hammer,以确保应用程序相信它正在加载的特殊Hammer实际上扩展了它所知道的Hammer。我尝

我正在尝试创建一个能够从外部.jar文件加载类的应用程序。但是,我需要引用我将按其类型加载的类(它是Sax解析器的DefaultHandler的孙子类)

我想我应该这样做:

我将定义一个抽象类DefaultHandler

外部文件中的类将扩展Hammer(让我们调用外部类SpecialHammer)

我将使用URLLoader加载SpecialHammer


问题是,我不知道如何(以及在哪里)定义Hammer,以确保应用程序相信它正在加载的特殊Hammer实际上扩展了它所知道的Hammer。我尝试在应用程序和external.jar中放入相同的Hammer类,但没有成功:/

我基本上需要知道如何在两个JAR之间共享一个抽象类,这样两个JAR都知道它们引用的是同一个类


如果有帮助的话,我会使用Eclipse。

我建议您使用Maven作为项目依赖项


这里有更多信息:

理论上,应用程序jar需要保存一个接口,这个接口需要被用于解析的类扩展,因此最好将它放在客户端和处理应用程序都可以共享的依赖项中

我认为在您的示例中要共享的类是Hammer(抽象类)和DefaultHammer,这样客户机就可以选择从哪个类进行扩展

因此,在common.jar中有抽象类Hammer和DefaultHammer,application.jar和client.jar将使用common.jar作为依赖项

可能有点离题,但根据用户/客户机的不同,更好的解决方案可能是使用Java的SPI接口(或者自己使用)。或者可能是允许您将代码注入JVM的Byteman(是一种在javac上封装-agent选项的DSL)


只需将外部jar添加到项目的类路径中,这不是重点-我希望应用程序可以扩展,而无需重新编译(它将读取xml文件,用户必须提供一个特定的类来处理xml读取-因为我不能依赖xml以同样的方式格式化。)好的,谢谢:)我想你刚刚解决了我的问题。