当我在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]
但该类确实有一个名为getName()
的方法。 http://docs.oracle.com/javase/6/docs/api/java/lang/management/RuntimeMXBean.html
答案 0 :(得分:2)
你一定错过了它,它就在那里。
getName()返回表示runn的名称 (import java.lang.management.ManagementFactory) (def运行时(bean(ManagementFactory / getRuntimeMXBean)) (:名称运行时)
;; => 类clojure.core $ bean $ fn_ 5177 $ fn _5178无法使用修饰符" public"访问类sun.management.RuntimeImpl的成员。 [抛出类java.lang.IllegalAccessException]
但该类确实有一个名为getName()的方法。 http://docs.oracle.com/javase/6/docs/api/java/lang/management/RuntimeMXBean.html
Java虚拟机。EDIT1:
RuntimeImpl
返回的类ManagementFactory.getRuntimeMXBean
仅包可见,但它实现了公共可见界面RuntimeMXBean
。所以会发生的是,函数bean
尝试在类RuntimImpl
上调用一个方法,但它不能因为类只是包可见。我认为,如果它试图在界面getMethod
上调用RuntimeMXBean
,那就可以了。
Yeap这是有效的:
(def mx-bean (ManagementFactory/getRuntimeMXBean))
(def interface-method
(.getMethod RuntimeMXBean "getName" (into-array java.lang.Class [])))
(.invoke interface-method mx-bean (into-array []))
我不确定它是否是一个错误或功能。我建议在Clojure邮件列表上询问。
答案 1 :(得分:0)
我认为这是由一个错误捕获的:http://dev.clojure.org/jira/browse/CLJ-978?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
Upvote it!
您可以使用可用的补丁来滚动自己的bean函数。