标签: clojure-java-interop

在Clojure for Java interop中创建Java枚举

我无法在Clojure中创建Java枚举.我想创建一个使用Java接口的Java枚举,然后将其传递给Java方法,所有这些都在Clojure中.我想这样做是为了使用neo4j图形库(我不想使用某人的预建接口,我想编写自己的互操作代码).

我在互联网上搜索,看起来我可以使用代理方法,但我不能为我的生活让它工作.这是我需要在Clojure中编写的等效Java代码:

private static enum RelTypes implements RelationshipType
{
    KNOWS
}
Run Code Online (Sandbox Code Playgroud)

这是我对它的刺痛(这不对:():

(proxy [org.neo4j.graphdb.RelationshipType] [] (KNOWS))
Run Code Online (Sandbox Code Playgroud)

我也想知道是否有一个很好的网站可以记录我所缺少的这类内容.我知道关于Clojure网站上的Clojure文档,这非常有用,但是例如使用我无法总是找到我需要的东西.也许我需要一本好的参考书?

clojure clojure-java-interop

4
推荐指数
1
解决办法
804
查看次数

Java互操作的Clojure优化

当使用现有的java类时,如果我做错了某些事情,我经常会收到反射警告,例如

IllegalArgumentException找不到匹配的字段:获取类java.lang.String clojure.lang.Reflector.getInstanceField(Reflector.java:271)

在每次调用给定方法时,clojure是否在运行时进行反射?或者这是以任何方式缓存的?将任何类型的java-interop移动到相关的java类中是否会有速度优势?

clojure clojure-java-interop

4
推荐指数
1
解决办法
249
查看次数

如何通过REPL探索Java方法

我正在玩Clojure和Java Interop,我想出了以下内容来检查某些实例的方法:

(defn methods-of [instance & [string]]
  {:pre [(nil? instance)]}
  (filter #(re-find (re-pattern (or string #".*")) %) (map #(.getName %) (-> instance class .getMethods))))
Run Code Online (Sandbox Code Playgroud)

但我想知道,鉴于这是从REPL获取此信息的一种非常实用的方法,如果有一些库可以实现这一目标(以及更多).

clojure clojure-java-interop

4
推荐指数
1
解决办法
591
查看次数

线程优先,线程最后和“点”形式

为什么这两个表达式都给出相同的结果?

> (macroexpand-all '(->> "string" (.charAt)))

(. "string" charAt)

> (macroexpand-all '(-> "string" (.charAt)))

(. "string" charAt)

难道不应该将“->>”宏插入“ string”作为列表中的最后一个元素吗?

macros clojure clojure-java-interop

3
推荐指数
1
解决办法
193
查看次数

Clojure - Java 互操作:传递一个 OutputStream 参数并返回一个 String

我正在使用一个 java 库并想调用一个导出数据的方法。

此方法有两种变体:一种具有用作目标文件名的 String 参数,另一种接受 OutputStream 对象并使用 OutputStreamWriter 写入该对象。

我想使用第二种方法并且能够将 OutputStream 返回到一个字符串中,这样我就可以用它做任何我想做的事情。

我不确定它实际上是否可行,但是当我发现 clojure.core/with-out-str 我有一些希望它是可能的,但是我不确定如何使用它。

是否可以将 OutputStream 参数从 Clojure 传递给 Java 方法并将写入的数据作为字符串取回?

谢谢。

编辑:

实际上,类构造函数接受一个 OutputStream 参数,一个方法通过它写入并关闭它。希望这可以帮助。

java outputstream clojure clojure-java-interop

3
推荐指数
1
解决办法
1608
查看次数

字段访问器作为clojure中的函数?

有没有办法将字段访问器转换为函数?当我试图这样做时,我真的很惊讶

(map .x [o1 o2])
Run Code Online (Sandbox Code Playgroud)

但反而必须这样做

(defn x [o] (.x o))
(map x [o1 o2])
Run Code Online (Sandbox Code Playgroud)

这似乎是不必要的.有没有办法为你创建这个功能?

clojure clojure-java-interop

3
推荐指数
1
解决办法
135
查看次数

clojure gen-class 返回自己的类

我现在正在用 Clojure 创建一个类对象,它有一个返回对象本身的方法。

用 Java 编写,我想制作的对象是,

class Point {
    public double x;
    public double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public Point copy() {
        return new Point(this.x, this.y);
    }
}
Run Code Online (Sandbox Code Playgroud)

我写的当前 clojure 代码就像,

(ns myclass.Point
  :gen-class
  :prefix "point-"
  :init init
  :state state
  :constructors {[double double] []}
  :methods [[copy [] myclass.Point]]))

(defn point-init [x y]
   [[] {:x x :y y}])

(defn point-copy [this]
   this)
Run Code Online (Sandbox Code Playgroud)

但是,我收到如下错误。

java.lang.ClassNotFoundException: myclass.Point
Run Code Online (Sandbox Code Playgroud)

虽然我用谷歌搜索过这个问题,但我找不到任何答案。有谁知道这个问题的解决方案?

预先感谢您的帮助。

clojure clojure-java-interop

3
推荐指数
1
解决办法
690
查看次数

Clojure REPL,互操作,无法解析符号

假设files是 Clojure 中的 Java 列表File,我想获取文件名列表。在 Leiningen REPL 中我可以使用,比如说,

(.getName (nth files 4))
=> "image.jpg"
Run Code Online (Sandbox Code Playgroud)

但如果我用

(map .getName files)
Run Code Online (Sandbox Code Playgroud)

REPL 抛出一个CompilerException java.lang.RuntimeException: Unable to resolve symbol: .getName in this context. 这是为什么?

我可以解决这个问题

(defn gn [file] (.getName file))
(map gn files)
Run Code Online (Sandbox Code Playgroud)

但我现在想知道是否有一种更优雅的方法将 Java 方法映射到 Clojure 中的列表。

java clojure clojure-java-interop

3
推荐指数
1
解决办法
341
查看次数

如何在 Kotlin 中运行 Clojure?

是否可以在 kotlin 中运行 clojure?春季更具体?

我在 clojure 中制作了刮刀,我想在用 kotlin 编写的 Web 应用程序中使用它们。这在 kotlin 中看起来如何?编码..

clojure clojure-java-interop kotlin kotlin-interop

3
推荐指数
1
解决办法
806
查看次数

Clojure:在 Java 对象上调用一系列方法

我在某处看到过这个文档,但我不记得函数的名称和名称:我正在搜索的是一个函数/宏,它以(Java)对象作为参数,在该对象上执行一系列方法,然后返回它。类似的东西:

(<the function> obj
  (.setName obj "the name")
  (.setAmount obj42.0)
  ; ...
  (.setDescription obj "the description"))  ; returns the updated obj
Run Code Online (Sandbox Code Playgroud)

clojure clojure-java-interop

3
推荐指数
1
解决办法
78
查看次数