【发布时间】:2011-04-28 08:07:58
【问题描述】:
这是 REPL 会话的摘录,希望能解释我想要实现的目标:
user> (Integer/parseInt "1")
1
user> (def y Integer)
#'user/y
user> (y/parseInt "1")
No such namespace: y
[Thrown class java.lang.Exception]
如何使用非类名、用户定义的符号访问 Java 类的静态方法/字段?
更新
以下按预期工作:
user> (eval (list (symbol (.getName y) "parseInt") "1"))
1
是否有更好/更惯用的方法来实现相同的结果?
【问题讨论】:
-
你能解释一下你为什么要这样做吗?
-
我必须应对设计不佳的 Java API,其中没有方法的基本接口由几个其他接口扩展,每个接口提供一个方法。这些方法旨在通过具体实现注册为回调,这是通过反射完成的(例如
Registry.registerCallback(ImplementedInterface/CONDITION, concreteInstance, "callbackMethodName"))。我想将所有的牦牛剃须代码隐藏在一个更温和的 Clojure API 后面,因此我需要动态绑定到一个接口并使用反射来执行回调注册。 -
eval 方法有一个偷偷摸摸的缺点:eval 不能在本地范围内使用变量;就好像它是在顶层执行的。因此, (let [x 1] (eval '(inc x))) 会导致“无法解析符号:x”错误。