如何在 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 中调用公共类的非公共方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有继承方法的情况下获取类的公共方法?

如何防止从特定类调用公共方法

C++调用公共基类的私有/受保护函数

C++ 使用变量访问类的公共成员

类的公共成员及其访问

减少公共代码调用公共类的代码重复