无需在Java中重新编译即可添加实现?

时间:2010-03-03 16:09:24

标签: java implementation recompile jar

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

  

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

基本上我将我的代码变成了可执行文件.jar和

  

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

这意味着什么?也许我只是错过了一些明显的东西?我不确定如何让他们只是投入他们自己的实现而不必重新编译所有内容...希望它不是太大的任务,因为我没有在我的大学里听到类似的东西(我认为)

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

5 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分: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中),因此可以在运行时更改它而无需重新编译。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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