2009-05-18 2 views
0

У меня есть проект Java, которому нужен интерфейс «аддон». Я думал о загрузке каких-либо файлов классов, имеющих методы по умолчанию, такие как initialize() и shutdown(), которые будут вызываться после того, как класс был загружен в приложение. Это способ сделать это? Как мне подойти к этой проблеме?Включая классы Java и запуская их во время выполнения

+0

Вы спрашиваете о динамической загрузке классов или определении поведения для инициализации для класса? –

+0

Динамическая загрузка классов. – Baversjo

ответ

3

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

В любом случае каждый класс, который требуется динамически загружать, должен будет реализовать ваш пользовательский интерфейс AddOn, таким образом реализуя initialize и shutdown.

+0

Это сработало! Я не знаю, является ли это «правильным» способом сделать это, и я рад обратной связи. Имейте в виду, что это только для загрузки одного класса: Class classfoo = Class.forName ("addonclass"); Объект foo = null; Объект [] foo2 = null; classfoo.getMethod ("initialize"). Invoke (foo, foo2); – Baversjo

+0

Рад слышать, как это работает! Я также заинтересован в обратной связи о «правильном» способе. У меня такое ощущение, что существует более элегантный способ ... – Stephan202

+0

«У меня такое ощущение, что существует более элегантный способ». Нет, это документированный правильный способ сделать это. – Jay

-1
public class SomeClass { 
    static { 
     System.out.println("Being called with the class is loaded"); 
     initialize(); 
    } 
    static void initialize(){} 
} 

Это ваш вопрос?

+0

Nice :) Но как я могу загрузить и запустить класс из файла? Класс не будет поставляться с приложением, пользователь «загрузит» аддон и добавит его в папку «addons». Приложение будет загружать все аддоны при запуске. – Baversjo

+0

Yeap. На самом деле я не совсем понял, на что был поставлен ваш вопрос. Class.forName - это в значительной степени путь. – OscarRyz

1

Во-первых, вам понадобится ClassLoader; вы можете получить текущий с getClass().getClassLoader(), но тогда ваши классы аддона должны быть в пути к классам. Возможно, вам захочется создать пользовательский загрузчик классов, который будет искать ваш каталог аддона.

Как только у вас есть ClassLoader, вы можете использовать его в load a class. Это дает вам объект Class; вы можете использовать отражение для вызова метода initialize(), если он присутствует.

+0

Вам нужен только ваш собственный загрузчик классов, если вы хотите нестандартный способ загрузки класса. Если класс существует как файл «.class» в папке на пути к классу, это сделает стандартный загрузчик классов. Если вы хотите, скажем, загрузить класс из Интернета за кулисами, тогда вам понадобится пользовательский загрузчик классов. – Jay

0

Еще один приятный способ реализации дополнений - java.util.Serviceloader. Посмотрите на javadocs, они объясняют принцип.

1

Если вы посмотрите на нечто более сложное, вы можете попробовать: http://jpf.sourceforge.net.

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

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