如何在clojure中使用bean函数

如何在clojure中使用bean函数,clojure,Clojure,当我在bean上使用bean函数时,我真的不明白它是如何工作的。这里的代码引发了一个异常: (import java.lang.management.ManagementFactory) (def runtime (bean (ManagementFactory/getRuntimeMXBean)) (:name runtime) ;; => Class clojure.core$bean$fn__5177$fn__5178 can not access a member of class

当我在bean上使用
bean
函数时,我真的不明白它是如何工作的。这里的代码引发了一个异常:

(import java.lang.management.ManagementFactory) (def runtime (bean (ManagementFactory/getRuntimeMXBean)) (:name runtime) ;; => Class clojure.core$bean$fn__5177$fn__5178 can not access a member of class sun.management.RuntimeImpl with modifiers "public" [Thrown class java.lang.IllegalAccessException] (导入java.lang.management.ManagementFactory) (def运行时(bean(ManagementFactory/getRuntimeMXBean)) (:name运行时) ;; => 类clojure.core$bean$fn\uuuu5177$fn\uuuuu5178无法使用修饰符“public”访问类sun.management.RuntimeImpl的成员 [抛出类java.lang.IllegalAccessException]
但是该类确实有一个名为
getName()
的方法,您一定错过了,它就在那里

getName()返回表示runn的名称 (导入java.lang.management.ManagementFactory) (def运行时(bean(ManagementFactory/getRuntimeMXBean)) (:name运行时)

;;=> 类clojure.core$bean$fn_5177$fn_5178无法使用修饰符“public”访问类sun.management.RuntimeImpl的成员 [抛出类java.lang.IllegalAccessException]

但该类确实有一个名为getName()的方法

使用Java虚拟机

编辑1:

这一问题与一个问题非常相似,对此的回应也是如此

RuntimeImpl
ManagementFactory返回。getRuntimeMXBean
是唯一可见的包,但它实现了公共可见接口
RuntimeMXBean
。因此,函数
bean
尝试调用类
RuntimeImpl
上的方法,但它不能,因为类只有包可见。I试想一下,如果它试图在接口
RuntimeMXBean
上调用
getMethod
,它会工作的


是的,这是有效的:

(def mx-bean (ManagementFactory/getRuntimeMXBean))
(def interface-method 
  (.getMethod RuntimeMXBean "getName" (into-array java.lang.Class [])))
(.invoke interface-method mx-bean (into-array []))

我不确定这是一个bug还是一个功能。我建议您在Clojure邮件列表中询问。

我认为这是由一个bug捕获的:

投票吧


您可以使用可用的补丁来运行自己的bean函数。

这是我的观点……当我尝试使用clojure的实现访问它时,bean会抛出一个异常。谢谢!我的问题有解决方法,但找出原因是很有意思的。顺便说一句,我编写这个包装器是为了改进系统分析