我正在尝试使用Clojure的一些Java类。我已经尝试使用Scala成功了,但是使用Clojure,我得到了一个IllegalArgumentException。
以下是API:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/Method.html
以下代码:
(import '(javax.sound.midi MidiSystem Sequencer Sequence))
(def mySequencer (MidiSystem/getSequencer))
(def mySequence (Sequence. Sequence/PPQ 10))
((.setSequence mySequencer) mySequence)
抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: No matching field found: setSequence for class com.sun.media.sound.RealTimeSequencer (recordmidi.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:5341)
at clojure.lang.Compiler.load(Compiler.java:5736)
at clojure.lang.Compiler.loadFile(Compiler.java:5699)
at clojure.main$load_script__6268.invoke(main.clj:213)
at clojure.main$script_opt__6296.invoke(main.clj:265)
at clojure.main$main__6314.doInvoke(main.clj:346)
at clojure.lang.RestFn.invoke(RestFn.java:409)
at clojure.lang.Var.invoke(Var.java:365)
at clojure.lang.AFn.applyToHelper(AFn.java:165)
at clojure.lang.Var.applyTo(Var.java:482)
at clojure.main.main(main.java:37)
Caused by: java.lang.IllegalArgumentException: No matching field found: setSequence for class com.sun.media.sound.RealTimeSequencer
at clojure.lang.Reflector.getInstanceField(Reflector.java:245)
at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:267)
at user$eval__11.invoke(recordmidi.clj:4)
at clojure.lang.Compiler.eval(Compiler.java:5325)
... 10 more
在Clojure 1.1.0和1.2.0中尝试过。在Scala中工作正常。 我也尝试使用Clojure查看Sequencer类的方法,是的,setSequence(Sequence)方法是。
这是我用过的Java调用的唯一问题。
答案 0 :(得分:2)
尝试
(.setSequence mySequencer mySequence)
这会在REPL中返回nil,在方法的void返回值(并转换为mySequencer.setSequence(mySequence),这听起来像你想要的)看来是正确的。
我曾经写过一篇关于使用Clojure的Java MIDI库的博客,也许它有点帮助: