clojure实现java类

原创 2015年11月18日 18:43:50

为什么需要这么干?因为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成员函数会在构造函数内部被调用。构造函数不需要实现,只需要声明参数形式。

具体可以参考下面两篇文档:

http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/gen-class

http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html


为了在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"


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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

clojure用gen-class来实现java接口,及java中测试

clojure借助gen-class实现java接口,提前编译为class文件? 这在很长一段时间困扰了我,虽然如《clojure编程》中也有介绍,但是却不知道如何运行, 一些细节没被提到,让我与...
  • lx1848
  • lx1848
  • 2016年06月07日 17:06
  • 403

clojure实现java类

为什么需要这么干?因为clojure可以调用java的类,但有时候这些java类需要你实现一个子类或者传递一个自定义的java对象作为参数,所以需要将clojure代码编译成java代码。 还记得之...
  • cpongo3
  • cpongo3
  • 2015年11月25日 17:09
  • 286

Programming Clojure学习笔记——与Java一起工作

3.1  调用Java Clojure提供了简单直接的语法调用Java代码:创建对象,调用方法,访问静态方法和属性。 访问构造函数,方法和属性 Clojure提供了new形式调用构造函数创建...

Clojure调用Java类的一个实例

  • 2016年05月18日 20:50
  • 530KB
  • 下载

03 storm 源码阅读 storm的进程间消息通信实现clojure端 加载java端netty能力

;; Licensed to the Apache Software Foundation (ASF) under one ;; or more contributor license agreeme...

Clojure - Java平台的Erlang

转载:http://www.iteye.com/news/117 Erlang是近两年非常吸引眼球的函数式编程语言,因为Erlang能够做到code-as-data,以及数据不变的特性,...

Storm源码分析入门:使用Counterclockwise远程单步调试Storm的Java和Clojure源码

单步调试代码可以非常直观地了解程序运行过程中状态变化。本文讲述了如何使用Counterclockwise远程调试Storm的Java和Clojure源码。这样可以更加直观和清晰地了解Storm源码。...

使用Clojure脚本扩展Java项目

1、非继承性的扩展 2、扩展中的问题 1)脚本的设计 扩展脚本包括:ext-input、ext-output、ext-assert三个固定部分; 中间层脚本执行扩展脚本的三个固定部分; 扩展脚本的...

Scala, Groovy, Clojure, Jython, JRuby and Java ----我们的工作语言

我们到底选择什么语言?

Clojure:算法练习的实现(一)——合并排序

*本系列文章使用Clojure来实现一些经典的算法,主要目的用于记录笔者对算法的重新学习(因此可能不会有过多的说明) 合并排序(Merge Sort) 产生随机数组 首先我们先给出一个产生随机数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:clojure实现java类
举报原因:
原因补充:

(最多只允许输入30个字)