clojure实现java类

页面导航:首页 > 软件编程 > Java编程 > clojure实现java类

clojure实现java类

来源: 作者: 时间:2016-01-21 09:39 【

为什么需要这么干?因为clojure可以调用java的类,但有时候这些java类需要你实现一个子类或者传递一个自定义的java对象作为参数,所以需要将clojure代码编译成java代码。还记得之前提过

为什么需要这么干?因为clojure可以调用java的类,但有时候这些java类需要你实现一个子类或者传递一个自定义的java对象作为参数,所以需要将clojure代码编译成java代码。

还记得之前提过的:gen-class么,在(ns...)中,使用(:gen-class),在(ns..)之外,应该用 (gen-class)

下面是一个例子, 文件MoveDailyAction.clj内容如下:

 

(ns kafka2hdfs.MoveDailyAction
  (:import [org.apache.hadoop.fs FileSystem Path]
           [java.io.IOException]
           [java.text DateFormat SimpleDateFormat]
           [java.util.Date]))

(gen-class
 :name kafka2hdfs.MoveDailyAction
 :implements [org.apache.storm.hdfs.common.rotation.RotationAction]
 :state dest
 :init init
 :constructors {[String][]})

(defn -init
  [dest]
  [[] dest])


这个类名叫MoveDailyAction,实现了RotationAction接口,有一个不可变的公有成员变量dest, 有一个init成员函数会在构造函数内部被调用。构造函数不需要实现,只需要声明参数形式。

 

为了在lein项目中,运行lein repl时自动加载并编译该类,需要在project.clj中的:aot中添加, 注意core.clj依赖MoveDailyAction.class,所以需要将MoveDailyAction放在前面先编译

 

:aot [kafka2hdfs.MoveDailyAction kafka2hdfs.core]

 

 

这里体会到:aot的用处了,就是需要将clojure代码提前编译成java class,然后用于其他地方。

在repl中运行下面的代码测试:

 

kafka2hdfs.core=> (def o (kafka2hdfs.MoveDailyAction. ab))
#'kafka2hdfs.core/o
kafka2hdfs.core=> (.dest o)
ab


 

构造函数接受的参数,在后面可以读取出来。

 

 

Tags:

相关文章

    文章评论

    最 近 更 新
    热 点 排 行
    Js与CSS工具
    代码转换工具
    
    <