Clojureはgen-classを使用してJavaインターフェースを実装し、Javaでテストします

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はクラスファイルのメソッドを呼び出します。


1.leinによって管理されるgen_classという名前のclojureプロジェクトを作成します。leinnewgen_class
次に、プロジェクトのルートディレクトリに入り、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_class
cd 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");
	} 
}

おすすめ

転載: blog.csdn.net/lx1848/article/details/51605147