2010-03-03 105 views
4

嗨大家好,我是第一个真正的工作机会(令人兴奋)的大学毕业生。我现在正处于他们需要看到一个编程示例的阶段,他们给了我用Java实现随机数字生成器服务的任务,有两个不同的实现(一个使用内置的东西和另一个我的选择) 。该代码是比较容易的部分,但任务的一部分是混淆了我......这就是:在不用Java重新编译的情况下添加实现?

由于评价者,我应该能够做到以下几点: 与考生编译我自己的项目jar文件。 注册我的解决方案与候选人可执行jar。 运行应用程序可执行jar,以某种方式告诉它运行我的实现。

基本上我做我的代码转换成可执行的.jar和

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

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

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

+4

看看'ServiceLoader'类:http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html –

+0

@Joachim:Shouldn这不是一个回答,而是一个评论? –

+0

@Aaron:可能......随意让它变成一个;-) –

回答

10

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

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

+2

像-DRandomNumberStrategy = my.own.random.impl.MyGenerator这样的简单vm参数将提供此功能。您可以在您自己的代码中使用该值来实例化并执行它。 – Robin

+0

@Robin更好......使用commons-discovery来实例化并执行它。 –

+0

感谢您的想法,我一定会在今晚看到他们!快速提问/澄清:“登记”到底是什么意思?简单地找到一种方法,以便他可以告诉主调用类使用他的实现? 至于commons-discovery部分,他们希望我只使用默认与JRE捆绑在一起的工具,所以一个接口可能就是要走的路... –

5

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

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配置文件应该在classpath中存在(不只是你的罐子里),所以它可以在运行时更改,而不重新编译。

+0

嗯,有趣。他提到他们喜欢在其中一次采访中使用Spring框架,所以或许我会检查一下,谢谢。 –

0

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

+0

嗯...他们要求一个简单的事情,而不是热切换服务的企业环境。正如Kevin Pauli和Aaron所说,反思和战略模式就足够了。 – helios

0

嗯,也许为了让这个过程更简单一些,他们没有给你提供你应该实现的类和方法原型的名称吗?我认为这是最合乎逻辑和直接的方式之一...就像我们的学校教授给我们一些任务,并且他要求我们的程序应该能够使用他提供的驱动程序类来运行,他通常会设置我们应该实施的类的名称以及方法的原型。 。只是一个想法...

+0

没有,他们只是说“实现一个随机数字生成器服务”使用两种方式,一种使用内置的Java工具(Random,SecureRandom等),另一种使用我选择的算法,并且也允许评估者添加他们的实现,所以没有给出名字不幸的。 –

相关问题