我试图弄清楚如何在Clojure中调用没有参数的static
方法。两个(不好)示例是(sun.misc.Unsafe/getUnsafe)
和(Object/getClass)
,两者都会引发由CompilerException
引起的NoSuchFieldException
。
是的我知道有一种更简单的方法可以调用getClass
而我根本不应该使用sun.misc.Unsafe
- 只是想知道如何在Clojure中调用一个无参数的静态方法。
答案 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中无参数静态方法调用的正确语法。