有没有一种方法可以在Jruby中获得良好的java对象输出



说我们有一个相当简单的java bean:

public class Test {
    private String thing;
    public void setThing(String thing) {
        this.thing = thing;
    }
    public String getThing() {
        return thing;
    }
    @Override
    public String toString() {
        return "Test{thing=" + thing + "}>";
    }
}

然后我们使用Ruby的豆子:

java_import 'Test'
t = Test.new
t.thing = 'blah'
p t

输出为:

#<Java::Default::Test:0x5fdba6f9>

,但我认为我喜欢的是

#<Test{thing=blah}>

甚至可能只是

Test{thing=blah}

我知道我可以在所有Java类中添加一种称为inspect()的方法,但是似乎每个实现都只会调用toString(),因为Java中toString()的意图通常与#inspect的意图相同无论如何,在Ruby中(即,一个仅打算被开发人员看到的字符串(。

所以我想知道的是,当在任何Java对象上调用#inspect时,是否有一种直接的方法告诉Jruby使用toString()

好吧,在任何其他Ruby实现中,我们都会将Object#inspect方法修补,但是Java类是不可能的,因为它们的实现是本机的。但是您可以做这样的事情以使您的生活更轻松:

module JavaInspect
  alias_method :inspect_without_to_string, :inspect
  def inspect_with_string
    self.respond_to?(:toString) ? self.toString : self.inspect_without_to_string
  end
  alias_method :inspect, :inspect_with_string
end
java_import 'Test'
Test.include(JavaInspect)
t = Test.new
t.inspect => "Test{thing=null}>"
t.inspect_without_to_string => "#<Java::Default::Test:0x4efac082>"

您只需要将模块包括到所需的类中。如果您真的很喜欢它,您甚至可以围绕java_import创建包装器。

请注意,我不建议猴子补丁Object,也不建议为生产代码创建类似的包装器,但是在开发中,这确实很有用,在某些情况下,在仔细考虑之后,它甚至可以在生产中使用。

最新更新