Java接口(Java Interface)
我们已经知道,Clojure代码最终在Java虚拟环境中运行。 因此,只有Clojure能够利用Java的所有功能才有意义。 在本章中,我们将讨论Clojure和Java之间的关联。
调用Java方法
可以使用点表示法调用Java方法。 一个例子是字符串。 由于Clojure中的所有字符串都是Java字符串,因此可以在字符串上调用普通的Java方法。
有关如何完成此操作的示例,请参见以下程序。
例子 (Example)
(ns Project
(:gen-class))
(defn Example []
(println (.toUpperCase "Hello World")))
(Example)
上述程序产生以下输出。 您可以从代码中看到,如果您只是为任何字符串方法调用点表示法,它也可以在Clojure中使用。
输出 (Output)
HELLO WORLD
使用参数调用Java方法
您还可以使用参数调用Java方法。 有关如何完成此操作的示例,请参见以下程序。
例子 (Example)
(ns Project
(:gen-class))
(defn Example []
(println (.indexOf "Hello World","e")))
(Example)
上述程序产生以下输出。 您可以从上面的代码中看到,我们将参数“e”传递给indexOf方法。 上述程序产生以下输出。
输出 (Output)
1
创建Java对象
可以使用类似于Java中的'new'关键字在Clojure中创建对象。
有关如何完成此操作的示例,请参见以下程序。
例子 (Example)
(ns Project
(:gen-class))
(defn Example []
(def str1 (new String "Hello"))
(println str1))
(Example)
上述程序产生以下输出。 您可以从上面的代码中看到,我们可以使用'new'关键字从Java的现有String类创建一个新对象。 我们可以在创建对象时传递值,就像我们在Java中一样。 上述程序产生以下输出。
输出 (Output)
Hello
下面是另一个示例,它显示了如何创建Integer类的对象并在常规Clojure命令中使用它们。
例子 (Example)
(ns Project
(:gen-class))
(defn Example []
(def my-int(new Integer 1))
(println (+ 2 my-int)))
(Example)
上述程序产生以下输出。
输出 (Output)
3
Import Command
我们还可以使用import命令在命名空间中包含Java库,以便可以轻松访问类和方法。
以下示例显示了我们如何使用import命令。 在示例中,我们使用import命令从java.util.stack库中导入类。 然后我们可以按原样使用堆栈类的push和pop方法。
例子 (Example)
(ns Project
(:gen-class))
(import java.util.Stack)
(defn Example []
(let [stack (Stack.)]
(.push stack "First Element")
(.push stack "Second Element")
(println (first stack))))
(Example)
上述程序产生以下输出。
输出 (Output)
First Element
使用Java命令运行代码
可以使用Java命令运行Clojure代码。 以下是如何完成此操作的语法。
java -jar clojure-1.2.0.jar -i main.clj
您必须提及Clojure jar文件,以便所有基于Clojure的类都将加载到JVM中。 'main.clj'文件是需要执行的Clojure代码文件。
Java内置函数 (Java Built-in Functions)
Clojure可以使用Java的许多内置函数。 其中一些是 -
Math PI function - Clojure可以使用Math方法得到PI的值。 以下是示例代码。
例子 (Example)
(ns Project
(:gen-class))
(defn Example []
(println (. Math PI)))
(Example)
上面的代码产生以下输出。
输出 (Output)
3.141592653589793
System Properties - Clojure还可以查询系统属性。 以下是示例代码。
例子 (Example)
(ns Project
(:gen-class))
(defn Example []
(println (.. System getProperties (get "java.version"))))
(Example)
根据系统上Java的版本,将显示相应的值。 以下是输出示例。
输出 (Output)
1.8.0_45