2012-09-13 39 views
1

我真的不明白bean函數在bean上的使用方式。這裏該代碼會拋出異常:如何在clojure中使用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

+1

BTW - https://github.com/clojure/java.jmx – noahlz

+0

我寫了這個包裝改進系統分析https://github.com/zcaudate/sigmund – zcaudate

回答

2

你一定錯過了它,它就在那裏。

getName()返回表示銀行經營 (進口java.lang.management.ManagementFactory) (DEF運行時(豆(ManagementFactory/getRuntimeMXBean)) (名稱:名稱運行時)

;; => 類clojure.core $ $豆FN_ 5177 $ FN _5178不能與修飾符訪問類sun.management.RuntimeImpl的成員 「公共」 [拋出該異常類java.lang.IllegalAccessException]

但該類確實有一個名爲getName()的方法。 http://docs.oracle.com/javase/6/docs/api/java/lang/management/RuntimeMXBean.html

ing Java虛擬機。

EDIT1:

這個問題是非常相似的一個here和應對是here

類別RuntimeImplManagementFactory.getRuntimeMXBean返回僅包可見,但它實現公共可見接口RuntimeMXBean。那麼會發生什麼呢是函數bean試圖調用類RuntimImpl上的方法,但它不能作爲類只有包可見。我認爲如果它試圖在界面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 [])) 

我不知道這是否是一個錯誤或功能。我會建議在Clojure郵件列表上提問。

+0

多數民衆贊成我的觀點...該豆引發異常當我嘗試使用clojure的實現來訪問它時 – zcaudate

+0

我已經更新了我的答案,請看看。 –

+1

謝謝!我的問題有解決方法,但找出原因很有意思。 – zcaudate