如何在 Clojure 中调用公共类的非公共方法?
Posted
技术标签:
【中文标题】如何在 Clojure 中调用公共类的非公共方法?【英文标题】:How do I call a non-public method of a public class in Clojure? 【发布时间】:2011-01-30 20:13:57 【问题描述】:我正在使用 Clojure 调用 twitter4j 库,如下所示:
(def twitter (. (TwitterFactory.) getInstance))
当我将它作为脚本调用时,它可以正常工作。但是当我使用 gen-class 时,我得到:
java.lang.IllegalArgumentException: Can't call public method of non-public class: public java.lang.Object twitter4j.TwitterFactoryBase.getInstance()
有解决办法吗?
【问题讨论】:
你能发布你的 gen-class 代码的骨架吗? 【参考方案1】:我自己没有这方面的经验,但 Meikel Brandmeyer 曾经写过一篇关于 gen-class 的精彩文章,也许这会对你有所帮助:
http://kotka.de/blog/2010/02/gen-class_how_it_works_and_how_to_use_it.html
【讨论】:
【参考方案2】:试试:
(def twitter (.getInstance (new TwitterFactory)))
【讨论】:
这没有任何区别。为什么会这样? 我不知道造成这种差异的原因是什么(作为 clojure 新手)。但是它对我有用:) 等等。真的吗?我认为区别只是语法糖(我实际上更喜欢你的方式——对我来说它似乎“更容易”)。 @sramsay - 你是对的,没有区别。实际上,您可以通过在 REPL 中输入(macroexpand '(Foo.))
来查看 Foo.
宏是如何扩展为 new Foo
的。也可以将(.bar baz)
扩展成(. baz bar)
以上是关于如何在 Clojure 中调用公共类的非公共方法?的主要内容,如果未能解决你的问题,请参考以下文章