我按照here的说明操作,并尝试通过调用 lein jar 从 clj 源生成Java类。
然而,当我编辑代码时,我添加了一个自己的测试函数:
(ns some.Example
(:gen-class))
(defn -main
[greetee]
(println (str "Hello " greetee "!")))
(defn -foo []
"foo bar")
..然后继续使用 lein jar 生成一个Java类文件(我在帖子的末尾附加了project.clj)我发现生成的 jar 包含作为内部类的方法:
$ jar tvf example-1.0.0.jar
76 Sun Feb 17 20:56:24 EET 2013 META-INF/MANIFEST.MF
1225 Sun Feb 17 20:56:24 EET 2013 META-INF/maven/some/example/pom.xml
87 Sun Feb 17 20:56:24 EET 2013 META-INF/maven/some/example/pom.properties
2697 Sun Feb 17 20:56:24 EET 2013 some/Example__init.class
1499 Sun Feb 17 20:56:24 EET 2013 some/Example$loading__4784__auto__.class
1035 Sun Feb 17 20:56:24 EET 2013 some/Example$_main.class
565 Sun Feb 17 20:56:24 EET 2013 some/Example$_foo.class
1771 Sun Feb 17 20:56:24 EET 2013 some/Example.class
162 Sun Feb 17 18:03:12 EET 2013 project.clj
129 Sun Feb 17 19:23:54 EET 2013 some/Example.clj
并且 some.Example 类仅包含主方法,但不包含 foo :
$ javap some.Example
public class some.Example {
public static {};
public some.Example();
public java.lang.Object clone();
public int hashCode();
public java.lang.String toString();
public boolean equals(java.lang.Object);
public static void main(java.lang.String[]);
}
所以问题是:我们如何指定一个 clj Clojure文件,该文件生成一个带有许多静态和实例方法的Java类,目的是从Java代码调用这些方法?
(defproject some/example "1.0.0"
:description "A sample project"
:dependencies [[org.clojure/clojure "1.4.0"]]
:aot [some.Example]
:source-paths ["."]
)
答案 0 :(得分:2)
您需要声明您的班级将拥有的方法:
(ns some.Example
(:gen-class
:methods [[foo [] String]]))
请注意,这会将foo声明为非静态方法,因此它还需要采用this
参数:
(defn -foo [this]
"foo bar")
如果您希望该方法是静态的,则需要附加一些元数据:
(ns some.Example
(:gen-class
:methods [#^{:static true}[bar [] int]]))
(defn -bar []
3)
尝试阅读this,它会更快一点。