概述
接下来的日子里我将不定时翻译如下内容
- 如何去实例化java类
- 如何调用java方法
- 如何扩展java类关于代理
- 如何去实现java接口类(implement)
- 如何去生成java类关于gen-class
- 其他有关交互操作的主题
本介绍教程覆盖到Clojure 1.5
Clojure 是设计成一个托管语言并与它的主机平台直接进行互操作(目前实现的有JVM,CLR等)
Clojure代码是编译成JVM字节码。对于Java对象的方法调用,Clojure 编译器将尝试发出与javac
产生同样的字节码(译者注:”Glojure的编译器将尝试编译出来的字节码与javac一样”)。
在Clojure里是可能实现接口, 扩展和生成java类的。
Clojure 还提供了方便的函数和宏,使得Java库容易调用和比它在java代码里调用会更简洁。
Imports
Java类可以引用或使用他们完全限定的名称(FQNs)例如 java.util.Date
或者导入在Clojure的命名空间使用 clojure.core/import
和引用短名称
java.util.Date ; ⇒ java.util.Date
(import java.util.Date)
Date ; => java.util.Date
ns
宏支持导入:
clojure (ns myservice.main (:import java.util.Date))
更多的关于ns
宏介绍可以在这篇文章找到 Clojure namespaces.
自动导入java.lang.*
类从java.lang包是自动导入。例如,你可以使用String
或Math
没有明确的导入它们:
(defn http-uri?
[^String uri]
(.startsWith (.toLowerCase uri) "http"))
;译者注
(http-uri? "www.baidu.com") ; => false
(http-uri? "http://www.baidu.com") ; => true
;-------
(Math/round 0.7886)
内部(嵌套)类
在java里,类可以被嵌套在其他类里面。他们被称为内部类,按照惯例,分开他们与外部类中间使用一个美元符号($):
(import java.util.Map$Entry)
Map$Entry ; ⇒ java.util.Map$Entry
;; 这个例子假定RabbitMQ java客户端是在java类路径里 this example assumes RabbitMQ Java client is on classpath
(import com.rabbitmq.client.AMQP$BasicProperties)
AMQP$BasicProperties ; ⇒ com.rabbitmq.client.AMQP$BasicProperties
注意如果你需要去使用两个类和一个或多个是内部类,他们全部需要分别导入。直到JVM是关联的,他们全是单独的类,他们是没有“导入层次结构”。