Статьи

Расплавление барьера JDK / .NET с помощью javonet

Концепция моста Java в .NET

 

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

Локальные системы, с другой стороны, не могут позволить ( или не должны?) Платить за установку всех этих адаптеров и преобразований данных, чтобы использовать технологии или библиотеки, которые доступны локально как часть базовой архитектуры системы.

Именно тогда на помощь приходят мосты между технологиями, и для тех, кто принимает решения в Java и заинтересован в интеграции технологий .NET в свои системы, javonet — это то, что приносит такие хорошие новости.            

javonet  делает возможным вызов .NET-объектов из Java-кода, так как он будет интегрирован в наш локальный JDK

Независимо от типа приложения, которое вы пишете (веб или автономное), вы можете вызывать любой метод для любого объекта .NET с вызовом стиля отражения. Это просто не может быть проще, чем это.

          

Пример использования

       

Установка javonet  заключается не более чем в загрузке фляги и активации ее лицензии. После этого вы готовы использовать любую библиотеку .NET, какую захотите.            

Давайте взглянем на потенциал javonet, разобравшись с одним из самых древних недостатков java-приложений для настольных компьютеров: пользовательским интерфейсом.

Каждый опытный Java-разработчик сталкивался с этой задачей по крайней мере один раз: постарайтесь сделать свой интерфейс как можно более естественным. Вы знаете, что не можете получить те же результаты, не потратив несколько часов, пытаясь найти правильный способ сделать это.            

Разве не было бы замечательно, если бы вы могли просто открывать диалоговые окна? Сделав еще один шаг вперед, разве не было бы неплохо использовать эту аккуратную стороннюю библиотеку, основанную на последнем пакете обновления .NET, о которой вы так много говорили от друзей по разработке .NET? Вы могли бы. Или вы можете просто подождать, пока Swing / AWT его примет (или начать самостоятельно участвовать в проекте с открытым исходным кодом).

Давайте начнем как можно быстрее. Предполагая, что у вас есть готовая среда Java, установлен Maven и ваша любимая IDE под рукой, выполните следующие действия:            

             

  1. Зайдите на http://www.javonet.com/  и следуйте инструкциям
  2. У вас есть готовый файл? Большой; давайте добавим это в наш репозиторий (это только я привередливый, вы можете избежать этого шага)
    mvn install:install-file -Dfile=javonet_1.4hf2.jar -DgroupId=com.javonet -DartifactId=javonet -Dversion=1.4hf2 -Dpackaging=jar
  3. Создать простой пустой проект
    mvn archetype:create -DgroupId=com.javonet -DartifactId=javonet-sample-project
  4. Добавьте зависимость к вашему пом
    <dependency>
         <groupId>com.javonet</groupId>
         <artifactId>javonet</artifactId>
         <version>1.4hf2</version>
    </dependency>         
  5. Получите это в свой classpath (я использую Eclipse)
    mvn eclipse:eclipse         
  6. Давайте код
  7. public class App {
          public static void main(String[] args) throws JavonetException {
                  Javonet.activate("your@email.com", "YOUR-LICENCSE-KEY", JavonetFramework.v40);
                  Javonet.addReference("Ookii.Dialogs.dll");
    
                  NObject dialog = Javonet.New("Ookii.Dialogs.InputDialog");
                  dialog.set("WindowTitle", "javonet did this!");
                  dialog.invoke("ShowDialog");
          }
    }	

Просто читая код выше, вы знаете, что здесь происходит что-то великое. Я только что использовал библиотеку .NET под названием Ookii http://www.ookii.org/Software/Dialogs/  (возможно, об этом говорил вам ваш друг с другой стороны) из Java. И как это выглядит?

     

Я использую Windows XP, классическую тему, и именно поэтому я ожидаю, что родной диалог будет показан … Давайте попробуем тот же InputDialog, используя Swing.


Как видите, этот выглядит не очень хорошо и определенно не родной.

Как было сказано ранее, это всего лишь пример; простая, но мощная демонстрация того, что использование нативных библиотек окупается при относительно низких затратах.            

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

            

Смотря дальше

     

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

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

<?xml version="1.0" encoding="ISO-8859-1" ?>
<javonet>
      			<!-- optional -->
      			<references>
	        		<reference>Ookii.Dialogs.dll</reference>
	      		</references>
		      <!-- mandatory -->
		      <activation>
		        <username>YOUR NAME</username>
		        <email>your@email.com</email>
		        <licencekey>YOUR-LICENSE-KEY</licencekey>
		      </activation>
		      <!-- optional (default .NET v35 and MTA) -->
		      <settings>
		        <framework>v40</framework>
		      </settings>
</javonet> 

Это помогает очистить наш код. Давайте посмотрим, что у нас есть,

		NObject dialog =Javonet.New("Ookii.Dialogs.InputDialog");
		dialog.set("WindowTitle","javonet did this!");
		dialog.invoke("ShowDialog");

В первой строке мы создаем экземпляр класса InputDialog. Что касается Java, каждый экземпляр заключен в объект NObject, который имеет минимальный, но согласованный набор методов для выполнения вызовов базового объекта .NET.

Полный набор инструментов для интеграции

Мы прошли через основное использование этого моста, но есть еще много места, чтобы покрыть.

Ниже перечислены некоторые функции, которые могут быть интересны всем, прежде чем принимать решение, подобное этому.

  •   Вызов статических методов и методов экземпляра, включая методы получения и установки 
  • Поддержка дженериков 
  • Поддержка коллекции 
  • Вывоз мусора 
    • Мусор, собранный в Java, будет утилизироваться в .NET 
    • Утилизация объектов также доступна путем вызова NObject.dispose () 
  • Передача аргументов по ссылке, по значению и в режиме out 
  • Доступ к вложенным типам 
  • Поддержка enum 
  • Поддержка прослушивания событий 
  • Обработка исключений
    • Единственное исключение JavonetException охватывает любое исключение на стороне .NET; затем вы применяете свою логику обработки по мере необходимости

Javonet  получает поддержку от всех этих, и есть некоторые другие интересные функции, которые действительно идут лишнюю милю, как       

             

  • Свободный интерфейс, который поможет вам предложить более чистый код
  • Вызов перегруженных методов с передачей идентифицируемого нуля в качестве аргумента         
  • Поддержка отладки для кода Java и .NET               
    • Правильно, отлаживайте Java с помощью Eclipse / NetBeans, затем переключайтесь на VisualStudio для отладки кода .NET                
  • Онлайн LAB API  для Вас , чтобы протестировать все функции               
    • Если вы когда-либо играли с игровой площадкой Google OAuth и вам понравилось, это для вас                   

Вывод

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

Как вы можете видеть, все хорошо для вас, чтобы начать проникать через языковой барьер программирования и использовать технологии .NET в ваших Java-приложениях.