Что то я в последнее время обленился. Раньше следил за всеми обновлениями в Java. В своё время Java 1.5 Tiger я просто «съел с потрохами», но, увы, всё уже подзабылось.
И как то совсем незаметно прошел для меня релиз Java 1.6 Mustang. Описывать все «плюшки» я в данной статье не буду, а расскажу только о ServiceLoader'е.
Самый простой пример использования ServiceLoader'а — это разработка модульного приложения. Если бы я не знал о существовании данного класса, то я бы скорее всего использовал какой нибудь RCP, например Eclipse RPC или же NetBeans RPC. Но довольно часто уже есть написанное приложение, к которому хочется прикрутить возможность использования плагинов. Причём хочется сделать это просто, изяшно, без «лишней крови».
Итак, мы будем делать модульный «Hello World». В обязанности модуля входит предоставить строчку, которая с помощью главной программы и будет выведена в консоль.
Создадим jar файл с API нашего модуля и положим в него один единственный файлик demo.HelloWorldInterface.java следующего содержания:
Мы описали интерфейс, который будет использоваться в главной программе и который мы сейчас заимплементим нашим плагином.
Создадим jar файл с имплементацией нашего API и положим в него сначала файлик demo.HelloWorldImpl.java следующего содержания:
А потом еще положим файлик demo.HelloWorldInterface в директорию META-INF/services в котором содержится всего одна строчка
А теперь реализуем нашу главную программу. Код класса demo.Main, к котором содержится main метод выглядит примерно так
А теперь запустите Main класс с указанием в class path наших двух предварительно подготовленных jar'ок. Вуаля. Модульное приложение готово. Вся магия кроется в методе ServiceLoader.load(), при вызове которого происходит поиск во всех загруженных jar'ах в директории META-INF/services файлов с именем переданного интерфейса (в данном случае demo.HelloWorldInterface) и из них считываются имена классов, которые имплементят данный интрефейс. После этого создаются экземпляры этих классов и возвращаюься данным методом.
И как то совсем незаметно прошел для меня релиз Java 1.6 Mustang. Описывать все «плюшки» я в данной статье не буду, а расскажу только о ServiceLoader'е.
Самый простой пример использования ServiceLoader'а — это разработка модульного приложения. Если бы я не знал о существовании данного класса, то я бы скорее всего использовал какой нибудь RCP, например Eclipse RPC или же NetBeans RPC. Но довольно часто уже есть написанное приложение, к которому хочется прикрутить возможность использования плагинов. Причём хочется сделать это просто, изяшно, без «лишней крови».
Модульный Hello World.
Постановка задачи
Итак, мы будем делать модульный «Hello World». В обязанности модуля входит предоставить строчку, которая с помощью главной программы и будет выведена в консоль.
API модуля
Создадим jar файл с API нашего модуля и положим в него один единственный файлик demo.HelloWorldInterface.java следующего содержания:
package demo;
public interface HelloWorldInterface {
public String getMessage();
}
* This source code was highlighted with Source Code Highlighter.
Мы описали интерфейс, который будет использоваться в главной программе и который мы сейчас заимплементим нашим плагином.
Плагин
Создадим jar файл с имплементацией нашего API и положим в него сначала файлик demo.HelloWorldImpl.java следующего содержания:
package demo;
public class HelloWorldImpl implements HelloWorldInterface {
public String getMessage() {
return "Hello World";
}
}
* This source code was highlighted with Source Code Highlighter.
А потом еще положим файлик demo.HelloWorldInterface в директорию META-INF/services в котором содержится всего одна строчка
demo.HelloWorldImpl
Главная программа
А теперь реализуем нашу главную программу. Код класса demo.Main, к котором содержится main метод выглядит примерно так
package demo;
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
for (HelloWorldInterface hw : ServiceLoader.load(HelloWorldInterface.class)) {
System.out.println(hw.getMessage());
}
}
}
* This source code was highlighted with Source Code Highlighter.
Запуск
А теперь запустите Main класс с указанием в class path наших двух предварительно подготовленных jar'ок. Вуаля. Модульное приложение готово. Вся магия кроется в методе ServiceLoader.load(), при вызове которого происходит поиск во всех загруженных jar'ах в директории META-INF/services файлов с именем переданного интерфейса (в данном случае demo.HelloWorldInterface) и из них считываются имена классов, которые имплементят данный интрефейс. После этого создаются экземпляры этих классов и возвращаюься данным методом.