如何在Clojure中调用没有参数的Java静态方法?

时间:2014-04-23 20:27:57

标签: java clojure

我试图弄清楚如何在Clojure中调用没有参数的static方法。两个(不好)示例是(sun.misc.Unsafe/getUnsafe)(Object/getClass),两者都会引发由CompilerException引起的NoSuchFieldException

是的我知道有一种更简单的方法可以调用getClass而我根本不应该使用sun.misc.Unsafe - 只是想知道如何在Clojure中调用一个无参数的静态方法。

2 个答案:

答案 0 :(得分:5)

您的示例似乎不起作用,但以下情况

(System/currentTimeMillis)
> 1398285925298

这就是调用无参数静态方法的方法。

Object/getClass doesn't appear是一个静态方法。它意味着要在一个对象上调用,而不是一个类。

答案 1 :(得分:3)

获取Unsafe实例涉及克服一些访问限制。最简单的方法是使用反射;请参阅Mykhailo Kozik撰写的Java Magic. Part 4: sun.misc.Unsafe博客文章,了解此方法和其他方法。这是一个Clojure片段就是这样做的:

(let [f (.getDeclaredField sun.misc.Unsafe "theUnsafe")]
  (.setAccessible f true)
  (.get f nil))
;= #<Unsafe sun.misc.Unsafe@63124f52>

正如acomar和WolfeFan所指出的,getClass不是静态方法 - 它是Object声明的实例方法,因此可用于所有对象:

(.getClass the-unsafe) ; the-unsafe obtained as above
;= sun.misc.Unsafe

至于实际问题,(Foo/meth)是Clojure中无参数静态方法调用的正确语法。