如何在clojure中使用bean函数

时间:2012-09-13 05:11:03

标签: 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 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

2 个答案:

答案 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:

此问题与here非常相似,对此的回复为here

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函数。