Clojure usa gen-class para implementar la interfaz java y probar en java

¿Clojure implementa la interfaz java con gen-class y la compila en un archivo de clase por adelantado?


Esto me ha preocupado durante mucho tiempo. Aunque hay ejemplos en "programación clojure", pero no sé cómo ejecutar estos ejemplos. No se mencionan algunos detalles, lo que me separa de la operación real.

Este blog también menciona algunos ejemplos de gen-class: https://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html

Pero todavía no conozco los detalles de cómo hacer que estos ejemplos funcionen.

Usaré un pequeño ejemplo para ilustrar los detalles que no entiendo. Implica el uso de lein, una herramienta de construcción de proyectos clojure.

La idea principal de este ejemplo es definir una interfaz con java, luego usar la clase gen de clojure para implementar la interfaz y finalmente probar si la implementación es exitosa en java.

La función gen-class se cambia a ': gen-class' cuando se usa en la función ns. Este método significa que el código clojure se compilará en archivos de clase java por adelantado.

Luego, Java llama al método en el archivo de clase.


1. Cree un proyecto clojure administrado por lein, llamado gen_class: lein new gen_class,
luego ingrese al directorio raíz del proyecto y modifique el archivo project.clj para:
(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 significa compilar el archivo gen-class.HelloImpl.clj por adelantado

 #: java-source -path significa que se especifica la ruta del código java, y el código bajo esta ruta se compilará automáticamente antes de que se compile el código clojure.

2. Ingrese al directorio del proyecto: src / gen_class
cd clase_gen / src /
Cree una carpeta: java_source / java_source
Cree un archivo HelloInterface.java que defina la interfaz java
package java_source;
public interface HelloInterface {
	void sayHello();
}
3. Cree el archivo clojure HelloImpl.clj en la ruta src / gen-class:
(ns gen-class.HelloImpl
	(:gen-class
	:implements [java_source.HelloInterface]))

(defn -sayHello
     [this ^String para]
(println "Hello, world! " para))
4. Abra cmd en el directorio raíz del proyecto y ejecute el comando: lein compile
5. HelloInterface y HelloImpl se compilarán en archivos de clase en el directorio de destino.
6. Ingrese al directorio test / gen-class, cree un directorio java, escriba el archivo java de prueba Test.java y llame al método sayHello en HelloImpl.class en él.
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");
	} 
}

Supongo que te gusta

Origin blog.csdn.net/lx1848/article/details/51605147
Recomendado
Clasificación