Clojure:通过实例变量或字符串(不是类名符号)调用java静态方法/字段

Clojure:通过实例变量或字符串(不是类名符号)调用java静态方法/字段,clojure,static-methods,clojure-java-interop,Clojure,Static Methods,Clojure Java Interop,我可以做以下事情,它的工作 => (. java.awt.event.KeyEvent getKeyText 10) "Enter" 但是,我有一个名为ev的java.awt.event.KeyEvent实例。比如说, => (class ev) java.awt.event.KeyEvent 我想这样调用该方法(但是,这会产生一个错误): 是否可以从实例调用静态方法 我已经阅读并搜索了堆栈溢出。问题不一样。就像在Java中一样,只有在编译时知道要调用哪个类的哪个方法,才能直接调

我可以做以下事情,它的工作

=> (. java.awt.event.KeyEvent getKeyText 10)
"Enter"
但是,我有一个名为ev的java.awt.event.KeyEvent实例。比如说,

=> (class ev)
java.awt.event.KeyEvent
我想这样调用该方法(但是,这会产生一个错误):

是否可以从实例调用静态方法


我已经阅读并搜索了堆栈溢出。问题不一样。

就像在Java中一样,只有在编译时知道要调用哪个类的哪个方法,才能直接调用静态方法。否则,您需要在类对象上使用反射来查找方法句柄。

下面是一个使用API的尝试

我们这样使用它:

(call-getKeyText-on-class KeyEvent 10)
;; => "Enter"

我可能发现了一个重复的问题,但我必须在那里阅读答案。。。谢谢我想可能是这样(我不写Java)。我想我得解决一下。。。(condp=(class ev)FirstClass(FirstClass/somethod)SecondClass(SecondClass/somethod)。如果您不知道实例的全部可能类名,这不完全是一个解决方案。我现在将此标记为可接受的答案,因为这对我来说是一个很好的理由使我的代码远离此模式。但是如果有人有宏/反射黑客,请随意共享。您正在查看的其他类中有哪些类具有
.getKeyText
静态方法?在本例中,特定类仅用作示例。据我所知,没有其他类定义getKeyText方法。
(ns playground.static-method-handle
  (:import [java.lang.invoke MethodType MethodHandles]))

;; Get a MethodType instance that encodes the shape of the method (return type and arguments)
(def getKeyText-method-type (MethodType/methodType String Integer/TYPE))

(defn call-getKeyText-on-class [cl key-code]
  (let [lu (MethodHandles/lookup)
        h (.findStatic lu cl "getKeyText" getKeyText-method-type)]
    (.invokeWithArguments h [(int key-code)])))
(call-getKeyText-on-class KeyEvent 10)
;; => "Enter"