4

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

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

基本上我正在将我的代码变成一个可执行的.jar,并且

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

这是什么意思?也许我只是错过了一些明显的东西?我不知道如何让他们只需投入自己的实现而不必重新编译所有内容......希望这不是一项艰巨的任务,因为我在我的大学还没有听说过这样的事情(我认为) .

非常感谢任何帮助/见解!

4

5 回答 5

10

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

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

于 2010-03-03T16:13:26.400 回答
5

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

于 2010-03-03T16:13:19.683 回答
1

使用Spring并利用ClassPathXmlApplicationContext通过 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 上下文并查找 bean。

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
IGenerator generator = applicationContext.getBean("randonNumberGenerator");

// IGenerator in the interface which MyGenerator and ADifferentGenerator implement

请记住,您的 Spring 配置文件应该存在于您的类路径中(不仅仅是在您的 jar 中),因此可以在运行时更改它而无需重新编译。

于 2010-03-03T16:44:04.627 回答
0

看看Eclipse使用的OSGi 框架。例如,Eclipse 能够加载新插件并主动将它们插入到运行环境中以便立即使用(无需重新启动即可应用)。你可以做同样的事情。

于 2010-03-03T16:47:00.190 回答
0

好吧,也许是为了让这更简单,他们不是为您提供了类的名称和您应该实现的方法原型吗?我认为这是最合乎逻辑和最直接的方法之一......就像我们学校的教授给我们一些任务,他要求我们的程序应该能够与他提供的驱动程序类一起运行,他通常设置名称我们应该与方法的原型一起实现的类......只是一个想法......

于 2010-03-03T17:17:39.360 回答