<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1853351228397900107</id><updated>2012-03-17T15:55:16.781-07:00</updated><category term='AOP'/><category term='JavaEE'/><category term='FP'/><category term='override'/><category term='programming'/><category term='IT'/><category term='JavaSE'/><category term='AOP framework IT Java JavaEE JavaSE OOP override programming Spring Spring property override'/><category term='OOP'/><category term='Clojure'/><category term='Functional programming'/><category term='Spring'/><category term='framework'/><category term='Spring property override'/><category term='Java'/><title type='text'>Lazy-codder's blog</title><subtitle type='html'>Блог очень сурового московского программиста.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lazy-codder.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1853351228397900107/posts/default/-/FP'/><link rel='alternate' type='text/html' href='http://lazy-codder.blogspot.com/search/label/FP'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Илья Рудаков</name><uri>http://www.blogger.com/profile/00514525135843476643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Z_8vu-Cu4B4/TEAYaYRkUYI/AAAAAAAAAM8/6SteKSjzJOw/S220/lg_logo_w_text.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1853351228397900107.post-2462106524432473539</id><published>2010-08-23T21:39:00.000-07:00</published><updated>2010-08-23T22:37:39.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOP framework IT Java JavaEE JavaSE OOP override programming Spring Spring property override'/><category scheme='http://www.blogger.com/atom/ns#' term='Functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='FP'/><title type='text'>Совместное использование Clojure и Java.</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;В&lt;/span&gt;&lt;/b&gt; этом посте я&amp;nbsp;на простом примере покажу&amp;nbsp;как соединить в одном проекте Clojure и Java. Сразу к делу...&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Создадим проект со следующим деревом каталогов по классическому шаблону для Maven проектов:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Z_8vu-Cu4B4/THNEannjPHI/AAAAAAAAAO0/T-3VEZ7Olu4/s1600/clojure_test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_Z_8vu-Cu4B4/THNEannjPHI/AAAAAAAAAO0/T-3VEZ7Olu4/s320/clojure_test.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;В папке &lt;i&gt;&lt;b&gt;src/main/clojure&lt;/b&gt;&lt;/i&gt; будут храниться исходники Clojure скриптов. В src/main/java - Java классы соответственно. В папку &lt;i&gt;&lt;b&gt;lib&lt;/b&gt;&lt;/i&gt; помещаем &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;clojure-1.2.0.jar&lt;/span&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;Мавеновский &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pom.xml&lt;/span&gt; выглядит следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;&lt;br /&gt;    &lt;modelversion&gt;4.0.0&lt;/modelversion&gt;&lt;br /&gt;&lt;br /&gt;    &lt;groupid&gt;test.clojure&lt;/groupid&gt;&lt;br /&gt;    &lt;artifactid&gt;TestClojure&lt;/artifactid&gt;&lt;br /&gt;    &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;&lt;br /&gt;&lt;br /&gt;    &lt;build&gt;&lt;br /&gt;        &lt;plugins&gt;            &lt;br /&gt;            &lt;plugin&gt;&lt;br /&gt;                &lt;groupid&gt;com.theoryinpractise&lt;/groupid&gt;&lt;br /&gt;                &lt;artifactid&gt;clojure-maven-plugin&lt;/artifactid&gt;&lt;br /&gt;                &lt;version&gt;1.1&lt;/version&gt;&lt;br /&gt;                &lt;configuration&gt;&lt;br /&gt;                    &lt;sourcedirectories&gt;&lt;br /&gt;                        &lt;sourcedirectory&gt;src/main/clojure&lt;/sourcedirectory&gt;&lt;br /&gt;                    &lt;/sourcedirectories&gt;&lt;br /&gt;                    &lt;namespaces&gt;&lt;br /&gt;                        &lt;namespace&gt;!telchat.app&lt;/namespace&gt;&lt;br /&gt;                    &lt;/namespaces&gt;&lt;br /&gt;                    &lt;script&gt;&lt;br /&gt;src/main/clojure/*.clj&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;                &lt;/configuration&gt;&lt;br /&gt;            &lt;/plugin&gt;&lt;br /&gt;        &lt;/plugins&gt;&lt;br /&gt;    &lt;/build&gt;&lt;br /&gt;&lt;br /&gt;    &lt;dependencies&gt;&lt;br /&gt;        &lt;dependency&gt;&lt;br /&gt;            &lt;groupid&gt;org.clojure&lt;/groupid&gt;&lt;br /&gt;            &lt;artifactid&gt;clojure&lt;/artifactid&gt;&lt;br /&gt;            &lt;version&gt;1.2.0&lt;/version&gt;&lt;br /&gt;        &lt;/dependency&gt;&lt;br /&gt;    &lt;/dependencies&gt;&lt;br /&gt;&lt;br /&gt;    &lt;repositories&gt;&lt;br /&gt;        &lt;repository&gt;&lt;br /&gt;          &lt;id&gt;clojure-releases&lt;/id&gt;&lt;br /&gt;          &lt;url&gt;http://build.clojure.org/releases&lt;/url&gt;&lt;br /&gt;        &lt;/repository&gt;&lt;br /&gt;        &lt;repository&gt;&lt;br /&gt;          &lt;id&gt;clojars&lt;/id&gt;&lt;br /&gt;          &lt;url&gt;http://clojars.org/repo/&lt;/url&gt;&lt;br /&gt;        &lt;/repository&gt;&lt;br /&gt;    &lt;/repositories&gt;    &lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Здесь определены зависимости &lt;i&gt;Clojure&lt;/i&gt; версии 1.2.0, указаны репозитории и подключен специальный плагин для компиляции &lt;i&gt;Clojure&lt;/i&gt; скриптов.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Теперь давайте немного по-программируем... Для начала определимся со средой для разработки. Лично я привык пользоваться &lt;b&gt;IntellijIDEA&lt;/b&gt;. Для написания примера я использовал &lt;b&gt;IntellijIDEA 9.0.3 Community Edition&lt;/b&gt; + &lt;b&gt;La Clojure&lt;/b&gt; плагин. Данная среда довольно удобная. &lt;i&gt;Clojure&lt;/i&gt; скрипты правильно подсвечиваются и даче работает autocomplition. Так же можно запускать REPL прямо из IDE. Хотя вы можете, так же, смело пользоваться Eclipse или, к примеру, Emacs.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Итак, создаем в папке &lt;i&gt;&lt;b&gt;clojure&lt;/b&gt;&lt;/i&gt; пакет &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;example.clojure.hello&lt;/span&gt; и помещаем туда файл Hello.clj.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z_8vu-Cu4B4/THNIGk6Yn9I/AAAAAAAAAO8/-IIJtx7XXjw/s1600/clojure1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_Z_8vu-Cu4B4/THNIGk6Yn9I/AAAAAAAAAO8/-IIJtx7XXjw/s320/clojure1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Далее наполняем Hello.clj следующим содержанием:&lt;br /&gt;&lt;br /&gt;&lt;pre class="clojure" name="code"&gt;(ns example.clojure.hello.Hello&lt;br /&gt;  (:gen-class&lt;br /&gt;    :methods [[sayHello[] void]&lt;br /&gt;               [sayHello[String] void]&lt;br /&gt;               [callFunction[clojure.lang.IFn] String]]))&lt;br /&gt;&lt;br /&gt;(defn -sayHello&lt;br /&gt;  ([this] (println "Hello, stranger!"))&lt;br /&gt;  ([this name] (println (str "Hello, " name "!"))))&lt;br /&gt;&lt;br /&gt;(defn -callFunction [this javaFunction]&lt;br /&gt;  (javaFunction (str "Vasya" "!")))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;Примечание&lt;/b&gt;&lt;/i&gt;. &lt;i&gt;К сожалению подсветка для Clojure кода в моем блоге не работает. Я думаю, эта проблема решится в ближайшем будущем.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Первой же строчкой в Hello.clj мы видим определение &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;namespace&lt;/span&gt;. Это своего рода аналог пакетов в Java. Одна разница, что &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;namespace&lt;/span&gt; в &lt;i&gt;Clojure&lt;/i&gt; должен оканчиваться именем файла, в котором находятся скрипты. В нашем случае - это Hello.clj и поэтому namespace оканчивается словом Hello.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Далее идет инструкция &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;(&lt;span class="Apple-style-span" style="color: purple;"&gt;:gen-class&lt;/span&gt;)&lt;/span&gt;. Эта инструкция сообщает, что для Hello.clj должен создаваться Hello.class. Для скомпилированного Hello.class автоматически будет создан статический метод &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;main&lt;/span&gt;, который вы можете переопределять.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Так же в инструкцию &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;:gen-class&lt;/span&gt;&lt;/span&gt; входит инструкция &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;:methods&lt;/span&gt;&lt;/span&gt;. В ней определены Java методы для &amp;nbsp;Hello.class.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;(defn -sayHello)&lt;/span&gt; и &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;(defn -callFunction)&lt;/span&gt; переопределяют поведение будущих методов в Hello.class. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Функция &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sayHello&lt;/span&gt; может принимать от 0 до 1 аргументов. В эту функцию мы будем передавать строку(String) из Java.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Функция &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;callFunction&lt;/span&gt; принимает на вход объект типа &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;clojure.lang.IFn&lt;/span&gt;. Это интерфейс, который автоматически реализуют все функции в &lt;i&gt;Clojure&lt;/i&gt;. Мы же реализуем его вручную в Java, чтобы можно было передавать Java код в &lt;i&gt;Clojure&lt;/i&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Реализуем интерфейс &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;clojure.lang.IFn&lt;/span&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;В папке java создадим три класса: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Function&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;MyJavaFunction&lt;/span&gt; и &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Greeting&lt;/span&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Z_8vu-Cu4B4/THNNZxeTVmI/AAAAAAAAAPE/SVhlnjxn32g/s1600/clojure2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_Z_8vu-Cu4B4/THNNZxeTVmI/AAAAAAAAAPE/SVhlnjxn32g/s320/clojure2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Класс &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Function&lt;/span&gt; - абстрактный. Он реализует интерфейс &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;clojure.lang.IFn&lt;/span&gt; следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;import clojure.lang.IFn;&lt;br /&gt;import clojure.lang.ISeq;&lt;br /&gt;&lt;br /&gt;public abstract class Function implements IFn {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke() throws Exception {&lt;br /&gt;        return doInvoke();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o) throws Exception {&lt;br /&gt;        return doInvoke(o);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1) throws Exception {&lt;br /&gt;        return doInvoke(o, o1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15, Object o16) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15, Object o16, Object o17) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15, Object o16, Object o17, Object o18) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17, o18);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15, Object o16, Object o17, Object o18, Object o19) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17, o18, o19);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object invoke(Object o, Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10, Object o11, Object o12, Object o13, Object o14, Object o15, Object o16, Object o17, Object o18, Object o19, Object... objects) throws Exception {&lt;br /&gt;        return doInvoke(o, o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16, o17, o18, o19, objects);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object applyTo(ISeq iSeq) throws Exception {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object call() throws Exception {&lt;br /&gt;        return doInvoke();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void run() {&lt;br /&gt;        doInvoke();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public abstract Object doInvoke(Object... obj);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Т.о. мы создали что-то вроде адаптера. Теперь мы можем расширять класс Function и переопределять только один метод &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;doInvoke(...)&lt;/span&gt;; как показано в примере &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;MyJavaFunction&lt;/span&gt;:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="java" name="code"&gt;public class MyJavaFunction extends Function {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public Object doInvoke(Object... obj) {&lt;br /&gt;        System.out.println("Function call from Java!");&lt;br /&gt;        System.out.println(String.format("Hello, %s", obj[0]));&lt;br /&gt;        return "JAVA FUNCTION WORK SUCCESS!";&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Отлично. Теперь собираем все воедино в классе &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Greeting&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;import example.clojure.hello.Hello;&lt;br /&gt;&lt;br /&gt;public class Greeting {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        Hello hello = new Hello();&lt;br /&gt;        if(args.length == 0) {&lt;br /&gt;            hello.sayHello();&lt;br /&gt;        } else {&lt;br /&gt;            hello.sayHello(args[0]);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        Function fun = new MyJavaFunction();&lt;br /&gt;        String result = hello.callFunction(fun);&lt;br /&gt;        System.out.println(result);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Итак, перед сборкой и запуском несколько комментариев. В &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Greeting&lt;/span&gt; мы создаем объект типа Hello из &lt;i&gt;Clojure&lt;/i&gt; namespace &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;example.clojure.hello.Hello&lt;/span&gt; и вызываем функцию &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sayHello&lt;/span&gt;. Далее мы создаем объект типа &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Function&lt;/span&gt; и передаем его в &lt;i&gt;Clojure&lt;/i&gt; функцию &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;callFunction&lt;/span&gt; и выводим на экран вернувшийся результат.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;Для того, чтобы собрать проект и упаковать его в jar нужно выполнить следующую команду:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;mvn clean clojure:compile install&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Чтобы запустить класс Greeting нужно выполнить команду:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;java -cp target/TestClojure-1.0-SNAPSHOT.jar:lib/clojure-1.2.0.jar Greeting&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;или&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;java -cp target/TestClojure-1.0-SNAPSHOT.jar:lib/clojure-1.2.0.jar Greeting Vasya&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Я запускал под Linux. Символ разделения ':' в Windows другой - ';')&lt;br /&gt;&lt;br /&gt;После выполнения вы должны увидеть что-то наподобие такого:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Hello, stranger!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Function call from Java!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;Hello, Vasya!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="background-color: #cccccc;"&gt;JAVA FUNCTION WORK SUCCESS!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1853351228397900107-2462106524432473539?l=lazy-codder.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazy-codder.blogspot.com/feeds/2462106524432473539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lazy-codder.blogspot.com/2010/08/clojure-java.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1853351228397900107/posts/default/2462106524432473539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1853351228397900107/posts/default/2462106524432473539'/><link rel='alternate' type='text/html' href='http://lazy-codder.blogspot.com/2010/08/clojure-java.html' title='Совместное использование Clojure и Java.'/><author><name>Илья Рудаков</name><uri>http://www.blogger.com/profile/00514525135843476643</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_Z_8vu-Cu4B4/TEAYaYRkUYI/AAAAAAAAAM8/6SteKSjzJOw/S220/lg_logo_w_text.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Z_8vu-Cu4B4/THNEannjPHI/AAAAAAAAAO0/T-3VEZ7Olu4/s72-c/clojure_test.png' height='72' width='72'/><thr:total>2</thr:total></entry></feed>
