1

beanBean で使用している場合、関数がどのように機能するのかよくわかりません。このコードは例外をスローします。

(java.lang.management.ManagementFactory をインポート)
(def runtime (bean (ManagementFactory/getRuntimeMXBean))
(:ランタイム名)


;; =>
クラス clojure.core$bean$fn__5177$fn__5178 はクラス sun.management.RuntimeImpl のメンバーに "public" 修飾子でアクセスできません
  [スローされたクラス java.lang.IllegalAccessException]

しかし、クラスには というメソッドがありgetName()ます。http://docs.oracle.com/javase/6/docs/api/java/lang/management/RuntimeMXBean.html

4

2 に答える 2

2

あなたはそれを逃したにちがいありません、それはすぐそこにあります。

getName() runn を表す名前を返します (import java.lang.management.ManagementFactory) (def runtime (bean (ManagementFactory/getRuntimeMXBean)) (:name runtime)

;; => クラス clojure.core$bean$fn_ 5177$fn _5178 はクラス sun.management.RuntimeImpl のメンバーに "public" 修飾子でアクセスできません [Thrown class java.lang.IllegalAccessException]

しかし、クラスには getName() というメソッドがあります。http://docs.oracle.com/javase/6/docs/api/java/lang/management/RuntimeMXBean.html

Java 仮想マシンを実行しています。

編集1:

この問題はこちらの問題と非常によく似ており、それに対する回答はこちらです

RuntimeImplによって返されるクラスはManagementFactory.getRuntimeMXBeanパッケージのみが表示されますが、パブリックに表示されるインターフェイスを実装していますRuntimeMXBean。そのため、関数beanはクラスのメソッドを呼び出そうとしますが、RuntimImplクラスはパッケージのみが表示されるため、できません。getMethodインターフェイスで呼び出そうとしたらうまくいったと思いますRuntimeMXBean


ええ、これはうまくいきます:

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

それがバグなのか機能なのかわかりません。Clojure メーリング リストで質問することをお勧めします。

于 2012-09-13T05:33:30.670 に答える