Добавление реализации без перекомпиляции в Java? - PullRequest
4 голосов
/ 03 марта 2010

Привет всем, я выпускник колледжа с моей первой реальной возможностью трудоустройства (захватывающая) Сейчас я нахожусь на этапе, когда им нужно увидеть пример программирования, и они дали мне задачу реализовать службу генератора случайных чисел в Java с двумя различными реализациями (одна с использованием встроенных компонентов, а другая на мой выбор) , Код - это простая часть, но одна часть задачи сбивает меня с толку ... вот она:

Как оценщик, я должен быть в состоянии сделать следующее: Скомпилируйте мой собственный проект с файлом jar кандидатов. Зарегистрируйте мое решение с помощью исполняемого файла jar кандидатов. Запустите исполняемый jar-файл кандидатов, попросив его запустить мою реализацию.

По сути, я превращаю свой код в исполняемый файл .jar, а

оценщики должны иметь возможность использовать код и скомпилированные классы, разработанные кандидатом, для подключения собственной реализации генератора случайных чисел без перекомпиляции кода кандидата.

Что, черт возьми, это значит? Может я просто упускаю что-то очевидное? Я не уверен, как позволить им просто добавить свою собственную реализацию без необходимости перекомпилировать все ... надеюсь, это не слишком большая задача, поскольку я не слышал о чем-то подобном (я думаю) в моем университете .

Любая помощь / понимание действительно приветствуется!

Ответы [ 5 ]

10 голосов
/ 03 марта 2010

Я думаю, это просто означает, что вы должны предоставить интерфейс RandomNumberGenerationStrategy как часть вашего публичного API, который может реализовать оценщик.

Затем предоставьте еще один хук, с помощью которого он может зарегистрировать свою конкретную реализацию вашего интерфейса, которую вы затем вызываете с помощью обратного вызова.

5 голосов
/ 03 марта 2010

Они хотят, чтобы вы загрузили JAR реализации с URLClassLoader ( см. Документы ), а затем использовали отражение для создания экземпляра основного класса и вызова правильного метода для вызова генератора случайных чисел.

1 голос
/ 03 марта 2010

Используйте 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 и найдите компонент.

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

// IGenerator in the interface which MyGenerator and ADifferentGenerator implement

Помните, что ваш файл конфигурации Spring должен существовать в вашем classpath (а не только внутри вашего jar-файла), чтобы его можно было изменить во время выполнения без перекомпиляции.

0 голосов
/ 03 марта 2010

Ну, может быть, чтобы сделать это как можно более простым, разве они не предоставили вам имя класса и прототипы методов, которые вы должны реализовывать? Я думаю, что это один из самых логичных и простых способов ... Например, когда наш школьный профессор дает нам какое-то задание, и он требует, чтобы наши программы могли работать с теми классами водителя, которые он предоставил, он обычно задает имя классов, которые мы должны реализовать вместе с прототипами методов ... просто мысль ...

0 голосов
/ 03 марта 2010

Посмотрите на OSGi Framework , который Eclipse использует. Например, Eclipse может загружать новые плагины и активно вставлять их в работающую среду для немедленного использования (применять без перезапуска). Вы можете сделать то же самое.

...