clojureはgen-classを使用してJavaインターフェイスを実装し、事前にクラスファイルにコンパイルしますか?
「clojureプログラミング」には例がありますが、実行方法がわからないので、細かいところまで触れていないので、実際の操作とは一線を画しています。
このブログでは、gen-classの例についても言及しています:https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html
しかし、これらの例を機能させる方法の詳細はまだわかりません。
小さな例を使用して、理解できない詳細を説明します。これには、clojureプロジェクトビルドツールであるleinの使用が含まれます。
この例の主なアイデアは、Javaでインターフェースを定義し、clojureのgen-classを使用してインターフェースを実装し、最後にJavaで実装が成功するかどうかをテストすることです。
ns関数で使用すると、gen-class関数は「:gen-class」に変更されます。このメソッドは、clojureコードが事前にJavaクラスファイルにコンパイルされることを意味します。
次に、javaはクラスファイルのメソッドを呼び出します。
次に、プロジェクトのルートディレクトリに入り、project.cljファイルを次のように変更します。
(defproject gen_class "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.7.0"]]
:aot [gen-class.HelloImpl]
:java-source-paths ["src/java_source"])
#:aotは、ファイルgen-class.HelloImpl.cljを事前にコンパイルすることを意味します
#:java-source-pathsは、Javaコードパスが指定されていることを意味し、このパスの下のコードは、clojureコードがコンパイルされる前に自動的にコンパイルされます。
2.プロジェクトディレクトリを入力します:src / gen_classcd gen_class / src /
フォルダを作成します:java_source / java_source
Javaインターフェイスを定義するファイルHelloInterface.javaを作成します
package java_source;
public interface HelloInterface {
void sayHello();
}
3.パスsrc / gen-classの下にclojureファイルHelloImpl.cljを作成します。
(ns gen-class.HelloImpl
(:gen-class
:implements [java_source.HelloInterface]))
(defn -sayHello
[this ^String para]
(println "Hello, world! " para))
4.プロジェクトのルートディレクトリでcmdを開き、次のコマンドを実行し
ます。leincompile 5. HelloInterfaceとHelloImplは、ターゲットディレクトリのクラスファイルにコンパイルされます。
6. test / gen-classディレクトリに入り、javaディレクトリを作成し、test javaファイルTest.javaを記述して、HelloImpl.classのsayHelloメソッドを呼び出します。
package gen_class.java;
import gen_class.HelloImpl;
import java_source.HelloInterface;
public class Test {
public static void main(String[] args) {
HelloInterface HelloI = new HelloImpl();
HelloI.sayHello("Java");
}
}