【问题标题】:How do I call a non-public method of a public class in Clojure?如何在 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 代码的骨架吗?

标签: clojure public-method


【解决方案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)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2018-09-27
    • 2015-12-17
    • 1970-01-01
    • 2020-03-18
    • 2020-03-27
    • 2011-08-16
    相关资源
    最近更新 更多