在Java中添加实现而不重新编译?

在Java中添加实现而不重新编译?,java,implementation,recompile,jar,Java,Implementation,Recompile,Jar,大家好,我是大学四年级学生,有了第一个真正的工作机会(令人兴奋)。我现在正处于他们需要看一个编程示例的阶段,他们让我用Java实现一个随机数生成器服务,有两种不同的实现(一种使用内置的东西,另一种由我选择)。代码是简单的部分,但任务的一部分让我困惑。。。这是: 作为评估者,我应该能够做到以下几点: 使用候选jar文件编译我自己的项目。 在候选可执行jar中注册我的解决方案。 运行候选可执行jar,以某种方式告诉它运行我的实现 基本上,我将代码制作成一个可执行的.jar,然后 评估者应该能够使用候

大家好,我是大学四年级学生,有了第一个真正的工作机会(令人兴奋)。我现在正处于他们需要看一个编程示例的阶段,他们让我用Java实现一个随机数生成器服务,有两种不同的实现(一种使用内置的东西,另一种由我选择)。代码是简单的部分,但任务的一部分让我困惑。。。这是:

作为评估者,我应该能够做到以下几点: 使用候选jar文件编译我自己的项目。 在候选可执行jar中注册我的解决方案。 运行候选可执行jar,以某种方式告诉它运行我的实现

基本上,我将代码制作成一个可执行的.jar,然后

评估者应该能够使用候选开发的代码和编译类插入自己的随机数生成器实现,而无需重新编译候选代码

这到底是什么意思?也许我只是错过了一些明显的东西?我不知道如何允许他们在不必重新编译所有内容的情况下直接投入自己的实现。。。希望这不是一项太大的任务,因为我在大学里没有听说过这样的事情(我想)


非常感谢您的任何帮助/见解

他们希望您使用
URLClassLoader
()加载实现JAR,然后使用反射实例化主类并调用正确的方法来调用随机数生成器。

我认为这只是意味着您应该提供一个RandomNumberGenerationStrategy接口作为公共API的一部分,评估者可以实现的

然后提供另一个钩子,他可以通过这个钩子注册您接口的特定实现,然后您可以通过回调调用它。

使用并利用Spring配置交换您的实现。您的Spring配置应该类似于以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
    <bean id="randonNumberGenerator"  class="com.me.MyGenerator"/>

    <!--
    <bean id="randonNumberGenerator"  class="com.someoneelse.ADifferentGenerator"/>
    -->
</beans>

请记住,Spring配置文件应该存在于类路径上(而不仅仅存在于jar中),这样就可以在运行时更改它,而无需重新编译

看一看使用的。例如,Eclipse能够加载新的插件,并将它们主动插入到运行的环境中以便立即使用(应用而无需重新启动)。您也可以这样做。

也许为了使这一点尽可能简单,他们没有提供您应该实现的类和方法原型的名称吗?我认为这是最符合逻辑和最直接的方法之一。。。比如,当我们学校的教授给我们一些作业,他要求我们的程序应该能够与他提供的驱动程序类一起运行时,他通常会设置我们应该与方法原型一起实现的类的名称。。。只是一个想法

看看
ServiceLoader
类:@Joachim:这不应该是答案而不是评论吗?@亚伦:可能。。。请随便做一个;-)类似-DRandomNumberStrategy=my.own.random.impl.MyGenerator这样的简单vm参数将提供此功能。您可以在自己的代码中使用该值来实例化和执行它。@Robin更好。。。使用commons discovery来实例化和执行它。感谢您的想法,今晚我一定会研究它们!快速提问/澄清:“注册”的确切含义是什么?只是想找到一种方法,让他告诉主调用类使用他的实现?至于commons discovery部分,他们希望我只使用默认情况下与JRE捆绑在一起的工具,因此一个接口可能是最好的选择……您可以在主类上提供一个方法,例如RandomNumberGenerationService.setStrategy(RandomNumberGenerationStrategy)我能够使用界面概念,一切都按照他们想要的方式工作(我希望如此)。再次感谢大家。嗯。。。他们要求的是一件简单的事情,而不是用于服务热交换的企业环境。正如Kevin Pauli和Aaron所建议的,反思和战略模式就足够了。嗯,很有趣。他在一次采访中提到他们非常喜欢使用Spring框架,所以也许我会看看,谢谢。不,他们只是说“实现一个随机数生成器服务”,使用两种方法,一种使用内置Java工具(random、SecureRandom等),另一种使用我选择的算法,并且还允许评估者添加它们的实现,因此不幸的是没有给出名称。
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
IGenerator generator = applicationContext.getBean("randonNumberGenerator");

// IGenerator in the interface which MyGenerator and ADifferentGenerator implement