Вы можете использовать org.eclipse.core.runtime.Platform
, чтобы получить org.eclipse.ui
Bundle и проверить версию.
Version ui = Platform.getBundle("org.eclipse.ui").getVersion();
// then do something with that
Зарегистрируйте MyListener
, если> = 3,5, и OldMyListener
в противном случае.
EDIT:
Да, вышесказанное подходит только для определения различий в поведении во время выполнения.
Eclipse поддерживает несколько приемов для загрузки только некоторых классов.
Самый простой с точки зрения разработки трюк, о котором упоминал @ShiDoiSi.
Bundle myBundle = org.osgi.framework.FrameworkUtil.getBundle(this.class);
Version ui = Platform.getBundle("org.eclipse.ui").getVersion();
Version cutOff = new Version(3,5,0);
final Executable processListener;
if (ui.compareTo(cutOff)<0) {
Class pc = myBundle.loadClass("my.pkg.OldListenerProcess");
processListener = (Executable) pc.newInstance();
} else {
Class pc = myBundle.loadClass("my.pkg.ListenerProcess");
processListener = (Executable) pc.newInstance();
}
processListener.execute(targetObject);
Другой вариант, который использует больше инфраструктуры eclipse, - это определение вашей собственной точки расширения, чтобы вклады из других пакетов могли решить, какую версию использовать. По сути, это тот же шаблон, что и выше, за исключением того, что проверка версии выполняется с помощью диапазонов зависимостей плагина, которые способствуют запуску Executable
. Зависит от org.eclipse.ui [0.0.0,3.5.0) для старого способа и просто указывает org.eclipse.ui 3.5.0 (это открытый диапазон на 3.5.0) для текущего пути. Затем вы можете прочитать ваше расширение и создать экземпляр класса.
Если вы создаете дополнительные плагины для этого (немного тяжелый вес для двух отличий), вы можете определить команду в вашем основном плагине и сделать так, чтобы дополнительные плагины обеспечивали эквивалентный обработчик. Плагины по-прежнему должны иметь диапазоны зависимостей, чтобы только один из них загружался для случая <3.5 или> = 3.5. Затем, используя командный API, вы можете выполнить команду (и запустится правильный обработчик).
ICommandService cmdS
= (ICommandService) workbenchWindow.getService(ICommandService.class);
Command process = cmdS.getCommand("my.pkg.ListenerProcess");
ParameterizedCommand cmd = new ParameterizedCommand(process, null);
IHandlerService handlerS
= (IHandlerService) workbenchWindow.getService(IHandlerService.class);
IEvaluationContext ctx = handlerS.createContextSnapshot(false);
ctx.addVariable("toAddListener", targetObject);
handlerS.executeCommandInContext(cmd, null, ctx);
Тогда ваша реализация обработчика будет использовать HandlerUtil.getVariable(event, "toAddListener")
для извлечения нужного объекта из ExecutionEvent.