2015-04-03 8 views
-1

Я пытаюсь создать приложение, которое сможет загрузить класс из внешнего .jar-файла. Тем не менее, мне нужно обратиться к классу, который я буду загружать по его типу (это класс внуков для партера DefaultHandler для Sax).Динамическая загрузка класса, который расширяет другой (из jar)

я думал, что сделать это таким образом:

Я определить абстрактный класс Молоток расширяет DefaultHandler

Класс во внешнем файле продлит Молоток (назовём внешний класс SpecialHammer)

Я загружу SpecialHammer с помощью URLLoader.


Проблема заключается в том, что я не знаю, как (и где), чтобы определить, Молоток, чтобы убедиться, что приложение считает, что SpecialHammer она загружается на самом деле расширяет Молоток его знает. Я попробовал поместить тот же класс Hammer в приложение и во внешнюю .jar, но это не помогло:/

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

Я использую Eclipse, если это поможет.

+0

Просто добавьте внешний баночку пути к классам вашего проекта – Brovoker

+0

То есть, к сожалению, не точка - я хочу, чтобы приложение было расширяемым без необходимости перекомпиляции его (он будет читать XML-файлы, и пользователь будет иметь для предоставления определенного класса для обработки чтения xml - так как я не могу зависеть от формата xmls, отформатированного таким же образом.) – Nouth

ответ

0

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

Я думаю, что класс, который будет использоваться в вашем примере, будет Hammer (абстрактный класс) и DefaultHammer, таким образом, у клиента есть выбор того класса, из которого они были бы расширены.

Итак, у вас будет абстрактный класс Hammer и DefaultHammer в common.jar, и как application.jar, так и client.jar будут использовать common.jar в качестве зависимости.

Возможно, немного не по теме, но, возможно, лучшее решение, в зависимости от пользователя/клиента, должно было бы использовать интерфейс SPI от Java (или сворачивать ваши собственные). Или, возможно, Byteman, который позволяет вам вводить код в JVM (это DSL, который обертывает опцию -agent на javac).

Blog about using Byteman

+0

Хорошо, спасибо :) Думаю, вы просто решили мою проблему. – Nouth

Смежные вопросы